В чем разница между отладкой и выпуском в Visual Studio?

Possible duplicate Debug Visual Studio Release in .NET

В чем разница между отладкой и выпуском в Visual Studio?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
113
0
42 745
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Если вы просмотрите параметры компиляции проекта и сравните их, вы увидите, в чем различия.

Предполагая, что вопрос касается нативного кода / кода C++ (это не совсем понятно из формулировки):

По сути, в Debug все оптимизации генерации кода отключены. Некоторые библиотеки (например, STL) по умолчанию используют более строгую проверку ошибок (например, итераторы отладки). Создается дополнительная отладочная информация (например, для «Изменить и продолжить»). В коде создается больше вещей для обнаружения ошибок (значения локальных переменных устанавливаются на неинициализированный шаблон, и используется куча отладки).

@Vilx: когда я ответил, тега .net еще не было, только visualstudio. Итак, я предположил, что это C++.

NeARAZ 15.12.2008 13:25

В основном отладка включает в себя много дополнительной информации, полезной при отладке. В режиме выпуска все это сокращается и обменивается на производительность.

1) Как насчет следующих проблем? В проекте ASP.NET MVC есть 3 конфигурации: базовая (веб), отладочная (web.debug), выпуск (web.release). Предположим, мы установили строку подключения отладки и выпуска путем преобразования в соответствующую конфигурацию (отладка и выпуск). При публикации мы можем публиковать в соответствии с нашим выбором в диалоговом окне публикации. Но при запуске приложения, несмотря на то, что я выбираю «Отладка», оно использует конфигурацию выпуска (поскольку я установил конфигурацию отладки в базовой и отладочной конфигурации), это нормально?
user5871859 08.05.2020 17:54
2) При запуске приложения в режиме отладки или выпуска использует ли VS базовую веб-конфигурацию или соответствующую веб-конфигурацию (web.debug.confg или web.release.config)?
user5871859 08.05.2020 17:54

Вероятно, стоит упомянуть очень очевидное, что флаги сборки допускают различную логику, которая должен может использоваться только для изменения ведения журнала и «консольного» обмена сообщениями, но может может быть злоупотреблена и кардинально изменена не только низкоуровневая, но и реальная бизнес-логика.

«... кардинально изменить ... реальную бизнес-логику» - звучит для меня как ошибка! У нас много условного кода, и его очень сложно понять. Кроме того, каждый флаг условного кода комбинация является, по сути, версией разные вашего программного обеспечения, которая должна быть протестирована, чтобы гарантировать правильность и базовую целостность. Согласно «Code Complete», моей Библии построения программного обеспечения, наша «основная директива» - это управление сложностью. (Это наша проблема №1, которую необходимо решить). Хорошо подумайте, прежде чем без разбора добавлять дополнительные условные флаги!

MicroservicesOnDDD 28.05.2020 20:34

Мой вышеупомянутый комментарий не был нацелен на этот ответ, в частности, что касается последнего предложения ... это было просто дополнительной вещью, которую я подумал, что читатели, которые приходят сюда, должны прочитать.

MicroservicesOnDDD 28.05.2020 21:50

Также обратите внимание, что при использовании MFC, например, проекты отладки связываются с нераспространяемыми версиями DLL, такими как MFC90D.DLL, в то время как сборки выпуска связываются с распространяемыми версиями, такими как MFC90.DLL. Вероятно, это похоже на другие фреймворки.

Поэтому вы, вероятно, не сможете запускать приложения для отладки на машинах, не предназначенных для разработки.

очень верно. Один раз столкнулся с этим, когда был у клиента. Работает на моей машине (TM).

Matt Jacobsen 20.04.2010 12:22

Вы можете их распространять ... (не знаю, можно ли). Они должны находиться в подпапке с соответствующими именами вашего приложения.

Andreas Reiff 17.07.2012 21:32

@Andreas Что касается моего примера, «нераспространяемые» означает, что Microsoft не распространяет их по позволять.

foraidt 18.07.2012 16:53

Очевидная разница, которую вы видите, - это размер двоичного файла. Сборка отладки создает двоичный файл большего размера, чем сборка выпуска.

При компиляции в Debug таблица символов добавляется к скомпилированному объекту файла кода, что позволяет программам отладки подключаться к этим двоичным файлам и получать доступ к значениям объектов и переменных.

Еще одно заметное отличие состоит в том, что в режиме выпуска двоичный файл просто вылетает из-за фатальной ошибки, в то время как в режиме отладки, если вы начнете отладку приложения в Visual Studio, вы можете проверить стек вызовов, который сообщает вам точное местоположение ошибочного оператора. .

Ответ принят как подходящий

Самое главное, что в режиме Debug оптимизаций нет, а в режиме Release есть оптимизации. Это важно, потому что компилятор очень продвинутый и может выполнять довольно сложные низкоуровневые улучшения вашего кода. В результате некоторые строки вашего кода могут вообще остаться без каких-либо инструкций, а некоторые могут быть перепутаны. Пошаговая отладка была бы невозможна. Кроме того, локальные переменные часто оптимизируются таинственным образом, поэтому часы и быстрые часы часто не работают, потому что переменная «оптимизирована». И есть множество других оптимизаций. Попробуйте как-нибудь отладить оптимизированный код .NET, и вы увидите.

Еще одно ключевое отличие состоит в том, что из-за этого настройки выпуска по умолчанию не беспокоятся о создании обширной информации о символах отладки. Это файл .PDB, который вы могли заметить, и он позволяет отладчику определить, какие инструкции сборки соответствуют какой строке кода и т. д.

«В результате некоторые строки вашего кода могут остаться вообще без каких-либо инструкций, а некоторые могут вообще запутаться». Ага, испортил это, используя кадры стека, чтобы получить имя текущего метода / свойства - и многие свойства были встроены в выпуск ...

kpollock 15.12.2008 13:30

«Самое главное, что в режиме отладки нет оптимизаций» - то спорно. самое главное, что есть отладочная информация, которая позволяет вам отлаживать. хотя это может существовать и в выпуске.

shoosh 15.12.2008 13:40

Я не знаю, какой режим используется по умолчанию (отладка / выпуск). Как правило, по моему опыту, все проекты находятся в режиме отладки, и команда установщиков позаботится об этом выпуске, чтобы избежать файла pdb и внести оптимизацию. Но сегодня я столкнулся с ситуацией, когда режим изменен на выпуск, и я не могу взломать код, используя точку останова. Я пробовал долго делать много вещей и, наконец, заметил, что это из-за проблемы с текущим режимом компиляции. @ Vlix - Спасибо за ответ.

kbvishnu 15.07.2013 15:55

Это на самом деле помогло мне решить проблему «Имя 'переменная' не существует в текущем контексте», с которой я столкнулся при попытке проанализировать символ в непосредственном окне при отладке приложения, соблюдающего конфигурацию выпуска по умолчанию. Большое спасибо!

M463 12.10.2016 10:57
1) Как насчет следующих проблем? В проекте ASP.NET MVC есть 3 конфигурации: базовая (веб), отладочная (web.debug), выпуск (web.release). Предположим, мы установили строку подключения отладки и выпуска путем преобразования в соответствующую конфигурацию (отладка и выпуск). При публикации мы можем публиковать в соответствии с нашим выбором в диалоговом окне публикации. Но при запуске приложения, несмотря на то, что я выбираю «Отладка», оно использует конфигурацию выпуска (поскольку я установил конфигурацию отладки в базовой и отладочной конфигурации), это нормально?
user5871859 08.05.2020 17:53
2) При запуске приложения в режиме отладки или выпуска использует ли VS базовую веб-конфигурацию или соответствующую веб-конфигурацию (web.debug.confg или web.release.config)?
user5871859 08.05.2020 17:54

@hexadecimal Круто! Комментарий к ответу 12-летней давности! :) В любом случае, ваш вопрос касается конфигурации, а не компиляции, и я никогда не использовал преобразования web.config, поэтому я действительно не знаю. Возможно, разместите новый вопрос? Также - «Отладка» и «Выпуск» - это просто имена по умолчанию для двух конфигураций сборки по умолчанию, которые поставляются с новыми проектами. Вы можете создавать других или изменять их, и это похоже на то, что вы (или кто-то из вашей команды). Так что это действительно зависит от того, что находится внутри этих конфигураций.

Vilx- 08.05.2020 18:01

@ Vilx- Большое спасибо, Вилкс, приятно снова слышать твой голос спустя 12 лет :))

user5871859 08.05.2020 18:42

«Отладка» и «Выпуск» на самом деле всего лишь две метки для целого ряда настроек, которые могут повлиять на вашу сборку и отладку.

В режиме «Отладка» у вас обычно есть следующее:

  • Файлы Program Debug Database, которые позволяют вам достаточно внимательно следить за выполнением программы в исходном коде во время выполнения.
  • Все оптимизации отключены, что позволяет вам проверять значение переменных и отслеживать функции, которые в противном случае могли бы быть оптимизированы отдельно или встроены.
  • Определение препроцессора _DEBUG, которое позволяет вам писать код, который в режиме отладки действует иначе, чем в выпуске, например, для инструментария ASSERT, которые следует использовать только во время отладки.
  • Связывание с библиотеками, которые также были скомпилированы с включенными параметрами отладки, которые обычно не развертываются для реальных клиентов (по причинам размера и безопасности)

В режиме «Release» оптимизации включены (хотя доступно несколько опций), а определение препроцессора _DEBUG не определено. Обычно вы все равно захотите сгенерировать файлы PDB, потому что очень полезно иметь возможность «отлаживать» в режиме выпуска, когда что-то работает быстрее.

«всего две метки» - фактически, Visual Studio дает вам возможность создавать более!. Это может быть исключительно полезно при тестировании программы. Например, я недавно написал программу для своей работы, которая принимает имена файлов из командной строки. Я протестировал синтаксический анализ командной строки, но как только это было сделано, я не хотел каждый день возиться с CMD и списками имен файлов; Я создал конфигурацию, с которой я мог использовать условную компиляцию для предоставления фиктивных значений командной строки и тестирования бизнес-логики программы, что дало мне гораздо более быстрый цикл итераций при разработке программы.

Brian S 12.11.2013 20:14

Кроме того, очевидно, что режим отладки создает множество дополнительных потоков, помогающих с отладкой. Они остаются активными на протяжении всего процесса, независимо от того, подключаете ли вы отладчик или нет. См. Мой связанный с этим вопрос здесь.

Но только для .NET (не C++)?

Peter Mortensen 30.12.2019 15:23

Меня тоже заинтересовал этот вопрос, когда я разработал приложение, скопированное из существующей конфигурации сборки Release.

У меня есть разработчик, которому интересно использовать это приложение в режиме отладки, поэтому я подумал, что нужно сделать, чтобы эта конфигурация сборки, существующая с именем ReleaseMyBuild, скопирована из конфигурации выпуска (и, следовательно, должна иметь все настройки, предназначенные для оптимизации выпуска. ), чтобы внезапно сменить команду и превратиться в отладочную сборку, несмотря на запутанное имя конфигурации сборки.

Я решил, что конфигурация проекта - это просто название и удобный способ выбрать «все множество настроек», о которых упоминает Йорис Тиммерманс. Я хотел знать, какие именно настройки могут быть, что делает конфигурацию сборки с именем "FOO" функцией оптимизированной сборки выпускать.

Вот один взгляд на это. Я создал новый VCXPROJ из пустого шаблона проекта из Visual Studio 2010. Затем я скопировал его и отредактировал оба, первый сохранил содержимое отладки, а второй - содержимое релиза. Вот разница, основанная на соответствующих различиях ...

Empty VCXPROJs Debug vs Release diff

ВЫПУСКАТЬ

<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 док.

Другие вопросы по теме