Possible duplicate Debug Visual Studio Release in .NET
В чем разница между отладкой и выпуском в Visual Studio?





Если вы просмотрите параметры компиляции проекта и сравните их, вы увидите, в чем различия.
Предполагая, что вопрос касается нативного кода / кода C++ (это не совсем понятно из формулировки):
По сути, в Debug все оптимизации генерации кода отключены. Некоторые библиотеки (например, STL) по умолчанию используют более строгую проверку ошибок (например, итераторы отладки). Создается дополнительная отладочная информация (например, для «Изменить и продолжить»). В коде создается больше вещей для обнаружения ошибок (значения локальных переменных устанавливаются на неинициализированный шаблон, и используется куча отладки).
В основном отладка включает в себя много дополнительной информации, полезной при отладке. В режиме выпуска все это сокращается и обменивается на производительность.
Вероятно, стоит упомянуть очень очевидное, что флаги сборки допускают различную логику, которая должен может использоваться только для изменения ведения журнала и «консольного» обмена сообщениями, но может может быть злоупотреблена и кардинально изменена не только низкоуровневая, но и реальная бизнес-логика.
«... кардинально изменить ... реальную бизнес-логику» - звучит для меня как ошибка! У нас много условного кода, и его очень сложно понять. Кроме того, каждый флаг условного кода комбинация является, по сути, версией разные вашего программного обеспечения, которая должна быть протестирована, чтобы гарантировать правильность и базовую целостность. Согласно «Code Complete», моей Библии построения программного обеспечения, наша «основная директива» - это управление сложностью. (Это наша проблема №1, которую необходимо решить). Хорошо подумайте, прежде чем без разбора добавлять дополнительные условные флаги!
Мой вышеупомянутый комментарий не был нацелен на этот ответ, в частности, что касается последнего предложения ... это было просто дополнительной вещью, которую я подумал, что читатели, которые приходят сюда, должны прочитать.
Также обратите внимание, что при использовании MFC, например, проекты отладки связываются с нераспространяемыми версиями DLL, такими как MFC90D.DLL, в то время как сборки выпуска связываются с распространяемыми версиями, такими как MFC90.DLL.
Вероятно, это похоже на другие фреймворки.
Поэтому вы, вероятно, не сможете запускать приложения для отладки на машинах, не предназначенных для разработки.
очень верно. Один раз столкнулся с этим, когда был у клиента. Работает на моей машине (TM).
Вы можете их распространять ... (не знаю, можно ли). Они должны находиться в подпапке с соответствующими именами вашего приложения.
@Andreas Что касается моего примера, «нераспространяемые» означает, что Microsoft не распространяет их по позволять.
Очевидная разница, которую вы видите, - это размер двоичного файла. Сборка отладки создает двоичный файл большего размера, чем сборка выпуска.
При компиляции в Debug таблица символов добавляется к скомпилированному объекту файла кода, что позволяет программам отладки подключаться к этим двоичным файлам и получать доступ к значениям объектов и переменных.
Еще одно заметное отличие состоит в том, что в режиме выпуска двоичный файл просто вылетает из-за фатальной ошибки, в то время как в режиме отладки, если вы начнете отладку приложения в Visual Studio, вы можете проверить стек вызовов, который сообщает вам точное местоположение ошибочного оператора. .
Самое главное, что в режиме Debug оптимизаций нет, а в режиме Release есть оптимизации. Это важно, потому что компилятор очень продвинутый и может выполнять довольно сложные низкоуровневые улучшения вашего кода. В результате некоторые строки вашего кода могут вообще остаться без каких-либо инструкций, а некоторые могут быть перепутаны. Пошаговая отладка была бы невозможна. Кроме того, локальные переменные часто оптимизируются таинственным образом, поэтому часы и быстрые часы часто не работают, потому что переменная «оптимизирована». И есть множество других оптимизаций. Попробуйте как-нибудь отладить оптимизированный код .NET, и вы увидите.
Еще одно ключевое отличие состоит в том, что из-за этого настройки выпуска по умолчанию не беспокоятся о создании обширной информации о символах отладки. Это файл .PDB, который вы могли заметить, и он позволяет отладчику определить, какие инструкции сборки соответствуют какой строке кода и т. д.
«В результате некоторые строки вашего кода могут остаться вообще без каких-либо инструкций, а некоторые могут вообще запутаться». Ага, испортил это, используя кадры стека, чтобы получить имя текущего метода / свойства - и многие свойства были встроены в выпуск ...
«Самое главное, что в режиме отладки нет оптимизаций» - то спорно. самое главное, что есть отладочная информация, которая позволяет вам отлаживать. хотя это может существовать и в выпуске.
Я не знаю, какой режим используется по умолчанию (отладка / выпуск). Как правило, по моему опыту, все проекты находятся в режиме отладки, и команда установщиков позаботится об этом выпуске, чтобы избежать файла pdb и внести оптимизацию. Но сегодня я столкнулся с ситуацией, когда режим изменен на выпуск, и я не могу взломать код, используя точку останова. Я пробовал долго делать много вещей и, наконец, заметил, что это из-за проблемы с текущим режимом компиляции. @ Vlix - Спасибо за ответ.
Это на самом деле помогло мне решить проблему «Имя 'переменная' не существует в текущем контексте», с которой я столкнулся при попытке проанализировать символ в непосредственном окне при отладке приложения, соблюдающего конфигурацию выпуска по умолчанию. Большое спасибо!
@hexadecimal Круто! Комментарий к ответу 12-летней давности! :) В любом случае, ваш вопрос касается конфигурации, а не компиляции, и я никогда не использовал преобразования web.config, поэтому я действительно не знаю. Возможно, разместите новый вопрос? Также - «Отладка» и «Выпуск» - это просто имена по умолчанию для двух конфигураций сборки по умолчанию, которые поставляются с новыми проектами. Вы можете создавать других или изменять их, и это похоже на то, что вы (или кто-то из вашей команды). Так что это действительно зависит от того, что находится внутри этих конфигураций.
@ Vilx- Большое спасибо, Вилкс, приятно снова слышать твой голос спустя 12 лет :))
«Отладка» и «Выпуск» на самом деле всего лишь две метки для целого ряда настроек, которые могут повлиять на вашу сборку и отладку.
В режиме «Отладка» у вас обычно есть следующее:
В режиме «Release» оптимизации включены (хотя доступно несколько опций), а определение препроцессора _DEBUG не определено. Обычно вы все равно захотите сгенерировать файлы PDB, потому что очень полезно иметь возможность «отлаживать» в режиме выпуска, когда что-то работает быстрее.
«всего две метки» - фактически, Visual Studio дает вам возможность создавать более!. Это может быть исключительно полезно при тестировании программы. Например, я недавно написал программу для своей работы, которая принимает имена файлов из командной строки. Я протестировал синтаксический анализ командной строки, но как только это было сделано, я не хотел каждый день возиться с CMD и списками имен файлов; Я создал конфигурацию, с которой я мог использовать условную компиляцию для предоставления фиктивных значений командной строки и тестирования бизнес-логики программы, что дало мне гораздо более быстрый цикл итераций при разработке программы.
Кроме того, очевидно, что режим отладки создает множество дополнительных потоков, помогающих с отладкой. Они остаются активными на протяжении всего процесса, независимо от того, подключаете ли вы отладчик или нет. См. Мой связанный с этим вопрос здесь.
Но только для .NET (не C++)?
Меня тоже заинтересовал этот вопрос, когда я разработал приложение, скопированное из существующей конфигурации сборки Release.
У меня есть разработчик, которому интересно использовать это приложение в режиме отладки, поэтому я подумал, что нужно сделать, чтобы эта конфигурация сборки, существующая с именем ReleaseMyBuild, скопирована из конфигурации выпуска (и, следовательно, должна иметь все настройки, предназначенные для оптимизации выпуска. ), чтобы внезапно сменить команду и превратиться в отладочную сборку, несмотря на запутанное имя конфигурации сборки.
Я решил, что конфигурация проекта - это просто название и удобный способ выбрать «все множество настроек», о которых упоминает Йорис Тиммерманс. Я хотел знать, какие именно настройки могут быть, что делает конфигурацию сборки с именем "FOO" функцией оптимизированной сборки выпускать.
Вот один взгляд на это. Я создал новый VCXPROJ из пустого шаблона проекта из Visual Studio 2010. Затем я скопировал его и отредактировал оба, первый сохранил содержимое отладки, а второй - содержимое релиза. Вот разница, основанная на соответствующих различиях ...
ВЫПУСКАТЬ
<PropertyGroup>
<WholeProgramOptimization>true</WholeProgramOptimization>
<ClCompile>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
ОТЛАЖИВАТЬ
<PropertyGroup>
<UseDebugLibraries>true</UseDebugLibraries>`
<ClCompile>
<Optimization>Disabled</Optimization>
Интересно, что в разделе Link они оба имеют для GenerateDebugInformation значение true.
In debug configuration, your program compiles with full symbolic debug information and no optimization. Optimization complicates debugging, because the relationship between source code and generated instructions is more complex.
The release configuration of your program has no symbolic debug information and is fully optimized. For managed code and C++ code, debug information can be generated in .pdb files, depending on the compiler options that are used. Creating .pdb files can be useful if you later have to debug your release version.
Ссылка Microsoft док.
@Vilx: когда я ответил, тега .net еще не было, только visualstudio. Итак, я предположил, что это C++.