В чем разница между 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.