В чем разница между отладкой и выпуском в Visual Studio? - PullRequest
103 голосов
/ 15 декабря 2008

Возможно дублирование Отладка выпуска Visual Studio в .NET

В чем разница между отладкой и выпуском в Visual Studio?

Ответы [ 10 ]

105 голосов
/ 15 декабря 2008

Самое главное, что в режиме отладки оптимизации нет, а в режиме выпуска есть оптимизации. Это важно, потому что компилятор очень продвинут и может сделать довольно хитрое низкоуровневое улучшение вашего кода. В результате некоторые строки вашего кода могут остаться без каких-либо инструкций, а некоторые могут перепутаться. Пошаговая отладка была бы невозможна. Кроме того, локальные переменные часто оптимизируются таинственным образом, поэтому часы и QuickWatches часто не работают, потому что переменная «оптимизирована». И есть множество других оптимизаций тоже. Попробуйте отладить оптимизированный код .NET, и вы увидите.

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

47 голосов
/ 15 декабря 2008

«Debug» и «Release» - это всего лишь две метки для целого ряда параметров, которые могут повлиять на вашу сборку и отладку.

В режиме «Отладка» у вас обычно есть следующее:

  • Файлы базы данных отладки программы, которые позволяют достаточно внимательно следить за выполнением программы в исходном коде во время выполнения.
  • Все оптимизации отключены, что позволяет вам проверять значения переменных и прослеживать функции, которые в противном случае могли бы быть оптимизированы или встроены
  • Определение препроцессора _DEBUG, которое позволяет вам писать код, который действует по-разному в режиме отладки по сравнению с выпуском, например, для инструментов ASSERT, которые должны использоваться только при отладке
  • Связывание с библиотеками, которые также были скомпилированы с опциями отладки, которые обычно не развертываются для реальных клиентов (из соображений размера и безопасности)

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

8 голосов
/ 15 декабря 2008

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

7 голосов
/ 15 декабря 2008

Если вы посмотрите параметры компиляции проекта и сравните их, вы увидите, в чем различия.

Предполагается, что вопрос о нативном / C ++ коде (это не совсем понятно из формулировки):

По сути, в Debug все оптимизации генерации кода отключены. Некоторые библиотеки (например, STL) по умолчанию более строгие проверки ошибок (например, отладочные итераторы). Генерируется больше отладочной информации (например, «Редактировать и продолжить»). В коде генерируется больше вещей для обнаружения ошибок (значения локальных переменных установлены в неинициализированный шаблон, используется куча отладки).

6 голосов
/ 16 августа 2010

Также, по-видимому, режим отладки создает множество дополнительных потоков, помогающих с отладкой. Они остаются активными на протяжении всего процесса, независимо от того, подключен ли отладчик или нет. Смотрите мой связанный вопрос здесь .

6 голосов
/ 15 декабря 2008

Также обратите внимание, что при использовании MFC, например, проекты отладки связываются с нераспространяемыми версиями DLL, такими как MFC90D.DLL, в то время как релиз создает ссылку на распространяемые версии, например MFC90.DLL. Вероятно, это похоже на другие фреймворки.

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

6 голосов
/ 15 декабря 2008

Вероятно, стоит упомянуть очень очевидное, что флаги сборки допускают различную логику, которую следует использовать только для изменения журналирования и "консольного" обмена сообщениями, но может быть злоупотребленным и резко изменить не только низкие уровни, но и реальную бизнес-логику.

3 голосов
/ 07 ноября 2015

Мне тоже стало интересно по этому вопросу, когда я разработал приложение, скопированное из существующей конфигурации сборки выпуска. У меня есть разработчик, который заинтересован в использовании этого приложения в режиме отладки, поэтому мне было интересно, что нужно сделать, чтобы эта конфигурация сборки существовала с именем ReleaseMyBuild, скопированным из конфигурации выпуска (и, таким образом, должна иметь все настройки, предназначенные для оптимизации выпуска ) внезапно менять команды и становиться отладочной сборкой, несмотря на непонятное имя конфигурации сборки. Я подумал, что конфигурация проекта - это просто имя и удобный способ выбрать «полный набор настроек», о котором упоминает Джорис Тиммерманс. Я хотел знать, что это за настройки, которые делают конфигурацию сборки с именем FOO функцией оптимизированной release build.

Вот один проблеск, я создал новый VCXPROJ из пустого шаблона проекта из VS2010. Затем я скопировал его и отредактировал оба: первое, чтобы сохранить содержимое отладки, а второе - содержимое выпуска. Вот разница, сосредоточенная на соответствующих различиях ... Empty VCXPROJs Debug vs Release diff

RELEASE

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

DEBUG

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

Интересно, что в разделе «Связь» у обоих GenerateDebugInformation установлено значение true.

3 голосов
/ 15 декабря 2008

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

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

Еще одно заметное отличие состоит в том, что в режиме Release двоичный файл просто аварийно завершится с фатальной ошибкой, а в режиме отладки. Если вы начнете отлаживать приложение в Visual Studio, вы можете проверить стек вызовов, который сообщает точное местоположение ошибочное утверждение.

0 голосов
/ 21 сентября 2015

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

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

К сожалению, вы должны запустить отладочную сборку. И да, для публикации вы должны использовать старый добрый FTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...