Visual C ++: разница между Начать с / без отладки в режиме выпуска - PullRequest
16 голосов
/ 29 июля 2010

В чем разница между Начать отладку ( F5 ) и Запуск без отладки ( CTRL - F5 ) когда код скомпилирован в Режим выпуска ?

Я вижу, что CTRL - F5 в 10 раз быстрее, чем F5 для некоторого кода C ++.Если я не ошибаюсь, отладчик подключен к процессу выполнения для F5 , а не для CTRL - F5 .Поскольку это режим Release, скомпилированный код не содержит отладочной информации.Итак, если у меня нет точек останова, время выполнения должно быть одинаковым для двух, не так ли?!

(Предположим, что режимы Release и Debug являются типичными конфигурациями, которые вы получаете при созданииновый проект Visual C ++.)

Ответы [ 4 ]

17 голосов
/ 07 декабря 2010

Проблема в том, что Windows помещает специальную кучу отладки, если она обнаруживает, что ваша программа работает под отладчиком.Это происходит на уровне операционной системы и не зависит от настроек режима отладки / выпуска для вашей компиляции.

Вы можете обойти эту «особенность», установив переменную среды: _NO_DEBUG_HEAP = 1

Эта же проблема уже давно сводит меня с ума;Сегодня я нашел следующее, откуда это сообщение: http://blogs.msdn.com/b/larryosterman/archive/2008/09/03/anatomy-of-a-heisenbug.aspx

7 голосов
/ 29 июля 2010

«Пуск без отладки» просто указывает Windows запустить приложение, как оно обычно выполняется.

«Начать с отладки» запускает отладчик VS и запускает приложение в отладчике.

Это на самом деле не имеет ничего общего с настройками сборки отладки / выпуска.

Когда вы создаете конфигурацию по умолчанию для отладки своего приложения, у вас будут следующие основные отличия от сборки выпуска:

  • Излучаемый код не будет оптимизирован, поэтому его легче будет отлаживать, поскольку он более точно соответствует вашему источнику
  • Компилятор и компоновщик выведет файл .PDB, содержащий множестводополнительная информация, помогающая отладчику - наличие или отсутствие этой информации не влияет на производительность кода, только на простоту отладки.
  • Условные макросы, такие как ASSERT и VERIFY, в выпуске не будут использоватьсясборка, но активная в отладочной сборке.

Каждый из этих элементов является независимым и необязательным! Вы можете включитьny или все они включены или выключены, и все равно запускаете код под отладчиком, вы просто не найдете жизнь такой простой.

Когда вы запускаете «с отладкой», вещи работают по-разному по нескольким причинам:

  • Отладчик VS очень неэффективен при запуске, отчасти потому, что все в VS работает медленно - в версиях, предшествующих VS2010, каждый пиксель экрана будет перекрашиваться примерно 30 раз, так как среда IDE переходит в режим отладки с сильным миганием иМерцаниепопробуйте загрузить эти файлы через Интернет, что в некоторых случаях может занять определенное время.
  • Ряд действий, обычно выполняемых вашим приложением (загрузка библиотек DLL, запуск потоков, обработка исключений), приводит к предупреждению отладчика.Это приводит как к замедлению их, так и к тому, что они работают последовательно.
4 голосов
/ 07 декабря 2010

IsDebuggerPresent() и OutputDebugString() ведут себя по-разному в зависимости от того, подключен ли отладчик.

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

0 голосов
/ 03 ноября 2010

При запуске «с отладкой» куча отладки используется даже для режима выпуска. Это приводит к серьезному замедлению в коде с использованием большого количества malloc / free или new / delete, что может произойти в коде C ++, если вы этого не заметите, потому что библиотеки / классы, как правило, скрывают это от вас при управлении памятью.

...