Приложение Visual Studio, работающее чрезвычайно медленный с отладкой

У меня есть собственная программа C++, которая работает больше чем в 20 раз медленнее при запуске с Отладки (F5), но выполнения в нормальной скорости при использовании запускаются без отладки (Ctrl + F5).

Не имеет значения, использую ли я отладочную сборку или сборку конечных версий. Также, если я использую WinDbg, программа является величиной медленнее.

Разве существует ли некоторая установка, которую я действительно выбирал неправильно или что-то?

19
задан Peter Mortensen 10 April 2018 в 15:08
поделиться

3 ответа

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

Если вы используете сервер символов (включая общедоступный сервер символов Microsoft), это может увеличить время запуска, поэтому убедитесь, что у вас есть локальный кеш символов в переменной _NT_SYMBOL_PATH , если это так. .

Также IDE работает с включенной отладочной кучей, но я не думаю, что это произойдет, если вы работаете вне IDE.

1
ответ дан 30 November 2019 в 03:38
поделиться

Это, конечно, не связано с определением символа _DEBUG или компиляцией кода в конфигурации отладки. Добавленный код отладки выполняется независимо от того, подключен ли отладчик к программе или нет.

Отладчик обычно не влияет на выполнение кода, он остается в стороне, вызывая WaitForDebugEvent. Что блокирует его, пока операционная система не сообщит ему, что произошло что-то заслуживающее внимания. Это может вызвать кучу кода в отладчике, который может замедлить выполнение вашей программы. Вы можете посмотреть список событий в документации по структуре DEBUG_EVENT.

Аннотируя их немного за пределами документации: отладчик вмешивается и может замедлить работу вашей программы, когда:

  • Программа загружает или выгружает DLL. Во время загрузки происходит много всего, отладчик ищет файл отладочных символов (.pdb). Он может связаться с сервером символов, чтобы загрузить его. Все точки останова, которые были установлены в исходном коде DLL, активируются. Это может быть довольно медленно, но эффект временный и обычно замедляет только запуск. Уведомление о загрузке/выгрузке можно увидеть в окне Output.

  • Программа вызывает исключение. Это активирует отладчик в момент возникновения исключения, "уведомление о первом шансе". Это может быть очень полезно, вы можете использовать флажок Debug + Exception, Thrown, чтобы заставить отладчик останавливаться в момент возникновения исключения. Вы можете увидеть сообщение об уведомлении в окне Output. Это делает замедление кода, который поднимает и ловит исключения, огромным и, вполне вероятно, является источником вашего замедления. Никогда не используйте исключения для управления потоком.

  • Поток начинает выполняться или завершается. Опять же, уведомление печатается в окно Output. Вам придется создать много потоков, чтобы это замедлило работу вашей программы.

  • Когда ваша программа использует OutputDebugString() для целей трассировки. Видима в окне Output. Еще один хороший кандидат на замедление, вывод попадает в битовое ведро, если не подключен отладчик. У вас не должно возникнуть проблем с диагностикой этой причины, очевидным побочным эффектом будет появление большого количества сообщений в окне Output.

  • Когда программа достигает точки останова. Не так уж много причин, чтобы оказаться в тупике из-за этого. Но вы можете установить точки останова, которые сильно замедляют работу программы, но не вызывают прерывания отладчика. В частности, условная точка останова, счетчик попаданий, фильтр и операция When Hit будут медленными. Используйте Debug + Windows + Breakpoints для просмотра определенных точек останова.

13
ответ дан 30 November 2019 в 03:38
поделиться

Отладка Visual C++ сопровождается большим количеством накладных расходов, особенно в STL. Попробуйте не определять _DEBUG, а определить NDEBUG.

0
ответ дан 30 November 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: