10 ответов:
самое главное, что в режиме отладки нет никаких оптимизаций, в то время как в режиме выпуска есть оптимизации. Это важно, потому что компилятор очень продвинутый и может сделать некоторые довольно сложные низкоуровневые улучшения вашего кода. В результате некоторые строки вашего кода могут остаться без каких-либо инструкций вообще, или некоторые из них могут быть перепутаны. Пошаговая отладка была бы невозможна. Кроме того, локальные переменные часто оптимизируются таинственным образом, поэтому часы и Быстрые часы часто не работают, потому что переменная "оптимизирована". И есть множество других оптимизаций тоже. Попробуйте отладить оптимизированный .NET-код когда-нибудь, и вы увидите.
еще одно ключевое отличие заключается в том, что из-за этого настройки выпуска по умолчанию не беспокоятся о создании обширной информации о символах отладки. Вот и все .PDB-файл, который вы могли заметить, и он позволяет отладчику выяснить, какие инструкции по сборке соответствуют какой строке кода, так далее.
"Debug" и "Release" на самом деле являются всего лишь двумя метками для целого ряда настроек, которые могут повлиять на вашу сборку и отладку.
В режиме "Debug" у вас обычно есть следующее:
- программа отлаживает файлы базы данных, которые позволяют достаточно внимательно следить за выполнением программы в исходном коде во время выполнения.
- все оптимизации отключены, что позволяет проверять значение переменных и трассировать в функции, которые в противном случае могли бы были оптимизированы прочь или в подкладке
- определение препроцессора _DEBUG, которое позволяет писать код, который действует по-разному в режиме отладки по сравнению с выпуском, например, чтобы инструмент утверждал, что должен использоваться только во время отладки
- связывание с библиотеками, которые также были скомпилированы с включенными параметрами отладки, которые обычно не развертываются для реальных клиентов (по причинам размера и безопасности)
в режиме" Release " включены оптимизации on (хотя доступно несколько параметров) и определение препроцессора _DEBUG не определено. Обычно вы все равно захотите создать файлы PDB, потому что очень полезно иметь возможность "отлаживать" в режиме выпуска, когда все работает быстрее.
в основном, debug включает в себя много дополнительной информации, полезной при отладке. В режиме выпуска все это сокращается и продается для производительности.
Если вы пройдете через параметры компиляции проекта и сравните их, вы увидите, каковы различия.
предполагая, что речь идет о собственном коде/C++ (это не совсем ясно из формулировки):
в принципе, в Debug все оптимизации генерации кода отключены. Некоторые библиотеки (например, STL) по умолчанию используют более строгую проверку ошибок (например, отладочные итераторы). Генерируется дополнительная отладочная информация (например, для "редактировать и продолжить"). Больше вещей генерируется в коде, чтобы поймать ошибки (значения локальных переменных установлены в неинициализированный шаблон, используется отладочная куча).
вероятно, стоит упомянуть очень очевидное, что флаги сборки допускают различную логику, которая должны используется только для изменения регистрации и" консольных " сообщений, но can злоупотреблять и резко изменить не только низкие уровни, но и фактическую бизнес-логику.
также обратите внимание, что при использовании MFC, например, отладочные проекты связываются с не распространяемыми версиями DLL, такими как
MFC90D.DLLв то время как релиз строит ссылку против распространяемых версий, таких какMFC90.DLL. Вероятно, это похоже на другие фреймворки.поэтому вы, вероятно, не сможете запускать отладочные приложения на машинах, не являющихся разработчиками.
кроме того, по-видимому, режим отладки создает много дополнительных потоков, чтобы помочь с отладкой. Они остаются активными в течение всего срока действия процесса, независимо от того, подключаете ли вы отладчик или нет. Смотрите мой связанный вопрос здесь.
очевидная разница, которую вы можете видеть, - это размер двоичного файла. Отладочная сборка создает двоичный файл большего размера, чем сборка выпуска.
при компиляции в Debug таблица символов добавляется в скомпилированный объект файла кода, что позволяет отладочным программам подключаться к этим двоичным файлам и оценивать значения объектов и переменных.
еще одно заметное различие заключается в том, что в режиме выпуска двоичный файл просто рухнет при фатальной ошибке в режиме отладки, если вы начните отладку приложения в Visual Studio, вы можете проверить стек вызовов, который сообщает вам точное местоположение ошибочного оператора.
мне тоже стало любопытно по этому вопросу, когда я разработал приложение, скопированное из существующей конфигурации сборки выпуска. У меня есть разработчик, который интересен в использовании этого приложения в режиме отладки, поэтому я задался вопросом, Что потребуется, чтобы сделать эту конфигурацию сборки, которая существует с именем ReleaseMyBuild, скопированным из конфигурации выпуска (и, следовательно, должен иметь все настройки, направленные на оптимизацию выпуска), чтобы внезапно изменить команды и стать сборкой отладки, несмотря на путаницу имя конфигурации сборки. Я решил, что конфигурация проекта-это просто имя и удобный способ выбрать "весь набор настроек", о которых упоминает Джорис Тиммерманс. Я хотел знать, что именно эти настройки могут быть такими, что делают конфигурацию сборки с именем " FOO " функцией оптимизированной релиз построить.
вот один взгляд на него, я создал новый VCXPROJ из пустого шаблона проекта из VS2010. Затем я скопировал его и отредактировал оба, первый сохраните содержимое отладки и второе содержимое выпуска. Вот разница, сосредоточенная на соответствующих различиях...
релиз
<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.
Я не знаю, каковы точные различия, потому что на самом деле нет никакой информации, легко доступной на этом.
но основное наблюдаемое различие заключается в том, что версия выпуска иногда портит полученный DLL-файл и, таким образом, делает приложение, веб-приложение непригодным для использования.
к сожалению, вы должны поставить debug build в производство. И да, для публикации вы должны использовать старый добрый FTP.

Comments