Как надежно отловить «точки останова» для многопоточного приложения в Visual Studio?(C ++, VS2008) - PullRequest
0 голосов
/ 13 октября 2011

У меня есть многопоточное приложение, которое я отлаживаю в IDE (Visual Studio 2008, Win7-64, C ++).

В целях «отладки» я «притворяюсь», что всегда имеюодин процессор (программа определяет количество локальных процессоров), но проект программы устанавливает минимум из двух потоков (например, «основной поток», который обрабатывает GUI и трафик событий, и вторую »обработку)msgstr "нить, где работа перемещена из" основной нити "). (В «производственной» сборке будет один основной поток и один или несколько «обрабатывающих» потоков в зависимости от количества обнаруженных процессоров.)

ВЫПУСК: Точки останова в коде (в среде IDE) иногда срабатывает, а иногда нет.Повторный запуск программы может «поймать» точку останова, когда предыдущий запуск не «поймал» (изменения исходного кода или перестройка не выполняются, чтобы увидеть это поведение изменения в точке останова, путь выполнения программыидентичны).

(Меня больше всего интересуют триггерные точки в не-GUI / не основном потоке, но я предполагаю, что это не имеет значения.)

ВОПРОС: Есть ли способ сделать эти точки останова более "надежными"?(Что влияет на то, «остановится» ли точка останова?)

Я знаю и НЕ заинтересован в следующем:

  • Источник не доступен-синхронизация с последним связанным исполняемым файлом
  • Сборка не является «отладочной» (символы отладки недоступны)
  • Требуется «Чистая сборка» (устаревшие артефакты отладки)
  • «Step Over / Into» может не работать должным образом, когда другой поток «разрывается» во время операции пошагового выполнения этого первого потока

В веб-поисках упоминалось, что возможно установка параметра компилятора на «x86 "а не" Any Processor "для отлова точек останова, не уверен, почему это может иметь значение ...?

Наконец, да, конечно, вся логика" должна "быть проверена в однопоточном приложении (например, перефакторинг для обеспечения детерминированного однопоточного исполнения для модульных и регрессионных тестов).Однако для текущего тестирования мне нужно , чтобы быть в «реальном» приложении (например, «интеграционное тестирование» или «системная интеграция»).

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Я собираюсь согласиться с VoidStar и другими комментариями.Я работал с VC6, VS2005, VS2008 и VS2010 и отлаживал с ними довольно сложные многопоточные приложения, и точки останова всегда были для меня надежными.

За одним исключением.Для проектов, использующих библиотеки DLL, иногда точки останова, установленные в коде из библиотеки DLL, не работают.Это не потому, что VS пропускает точку останова, а потому, что отладчик не может сопоставить эту строку кода с фактическим местоположением в скомпилированном коде, возможно потому, что файл pdb не может быть загружен по какой-то причине.Когда это происходит, вы видите пустой красный кружок на левом краю линии точки останова вместо полного красного шара.Может ли это быть вашей проблемой?

Я не выяснил, почему это иногда случается, но по моему опыту это происходит только для точек останова в модулях, которые не являются основным отлаживаемым проектом.Обходной путь, который я использую, состоит в том, чтобы запустить отладчик из DLL, поместив исполняемый файл в конфигурацию отладки при запуске для проекта DLL.Еще одна хитрость, которая иногда помогает, - это объединить все проекты в одном решении и настроить их все с правильными ссылками, чтобы с помощью одной компиляции вы могли перестроить все это.

Удачи, надеюсь, это поможет.

1 голос
/ 14 октября 2011

Обычно взлом чрезвычайно надежен.Вот несколько вещей, которые можно попробовать:

  1. Жесткий код точки останова с помощью DebugBreak ().Это всегда должно быть поймано, но если это демонстрирует такое же неработающее поведение, вы сузили проблему.
  2. Там, где в данный момент установлен bp, добавьте строку для печати на экран / файл и установите точку останова.на этой линии.Это должно быть наверняка эта линия действительно даже ударилась.У вас может быть странная, неожиданная ошибка, которая фактически пропускает весь раздел неожиданно, и это необходимо, чтобы быть уверенным.
  3. Попробуйте с оптимизацией и без нее.Отладка работает лучше всего, когда все оптимизации отключены, но даже при работе с защелкивающимися и встроенными функциями ожидаемые точки останова будут работать.Эта проблема возникает даже при отключенной оптимизации?
  4. Вы говорите, что ISO C ++, означает ли это, что вы фактически отключили все расширения Microsoft?Я никогда не компилировал таким образом в visual studio, но если у вас есть, попробуйте снова включить расширения и посмотреть, будет ли это иметь какой-либо эффект.
...