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