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