Подтвердить что ты не робот

Приложение Visual Studio работает очень медленно с отладкой

У меня есть встроенная программа на С++, которая работает > в 20 раз медленнее при запуске с Debug (F5), но работает с нормальной скоростью при использовании запуска без отладки (Ctrl + F5).

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

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

4b9b3361

Ответ 1

Установите переменную среды _NO_DEBUG_HEAP равным 1 (как показано на http://preshing.com/20110717/the-windows-heap-is-slow-when-launched-from-the-debugger)

Это также можно сделать изнутри Visual.

Теперь это всего лишь обходной путь, мне любопытно узнать, как реорганизовать программу, которая страдает от такого рода проблем. У вас есть много std:: map, shared_ptr или каких-либо других больших ограничений?

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

А именно, изменив /ZI на /ZI. Описание см. В странице msdn.

В любом случае я не использую функцию редактирования и продолжения.

Ответ 5

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

Ответ 6

Никто не упомянул о закрытии неиспользуемых исходных окон.

После закрытия 20+ неиспользуемых окон, отладка исходного источника от 5 секунд вернется к ~.2s. Этот необычно медленный проект загружает DLL динамически и что DLL также была перешагнута (и с открытым исходным окном), поэтому она кажется вероятной. Однако это был С# (заголовок и теги неспецифичны).

Ответ 7

Когда процесс создается под отладчиком, операционная система по умолчанию использует кучу отладки. Отладочная куча делает большую проверку вашей памяти, особенно при де-alloc.

Существует несколько возможных вариантов отключения использования Debug Heap:

  • Приложить к процессу вскоре после запуска. Это позволит вам быстро ускорить работу в режиме отладки и полностью узнать о режиме, в котором вы работаете.

  • Добавить параметр переменной среды _NO_DEBUG_HEAP = 1.
    Это можно установить глобально для машины или для конкретного экземпляра Visual Studio.

    а. В глобальном масштабе вы установите переменную среды через Панель управления → Система → Дополнительные системные настройки → Переменные среды и добавьте переменную _NO_DEBUG_HEAP = 1.
    Примечание. Это повлияет на любое приложение, которое вы отлаживаете.

    б. Для экземпляра Visual Studio вы можете открыть командную строку, установив переменную среды _NO_DEBUG_HEAP = 1, а затем откройте визуальную студию из этой командной строки. Это будет влиять только на процессы, созданные из этот экземпляр Visual Studio наследует среду переменная.

  • Добавить поведение отладчика, это возможно для VS2015. Есть два способа переопределить это:

    а. Чтобы изменить для конкретного проекта, перейдите к свойствам проекта. Свойства конфигурации → Отладка и изменение свойства среды _NO_DEBUG_HEAP на 1

    б. Чтобы изменить для каждого проекта в Visual Studio, откройте "Инструменты" → "Параметры" → "Отладка" и установите флажок "Включить распределитель кучи отладки Windows (только для родной)".
    Примечание: f переменная среды _NO_DEBUG_HEAP, указанная в "a", задана на уровне проекта, она переопределит эту глобальную настройку.