Отладка против выпуска в .NET - PullRequest
53 голосов
/ 18 сентября 2008

Продолжая мой предыдущий вопрос , существует ли исчерпывающий документ, в котором перечислены все доступные различия между режимами отладки и выпуска в приложении C # и, в частности, в веб-приложении?

Какие есть различия?

Ответы [ 9 ]

48 голосов
/ 18 сентября 2008

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

Различия в VS2005 включают в себя:

  • Константа отладки, определенная в конфигурации отладки

  • Оптимизация кода включена в конфигурации выпуска

а также другие отличия, которые вы можете увидеть, нажав на кнопку «Дополнительно»

Но вы можете:

  • Изменение параметров сборки для конфигураций отладки и выпуска в Project Propeties / Build

  • Создайте свои собственные пользовательские конфигурации, щелкнув правой кнопкой мыши решение в обозревателе решений и выбрав Configuration Manager

Я думаю, что поведение константы DEBUG довольно ясно (на него можно ссылаться в директиве препроцессора #if или в ConditionalAttribute). Но я не знаю какой-либо исчерпывающей документации о том, какие именно оптимизации включены - на самом деле я подозреваю, что Microsoft захочет бесплатно улучшить свой оптимизатор без предварительного уведомления

15 голосов
/ 24 февраля 2009

Нет ни одного документа, в котором перечислены различия. В дополнение к некоторым из уже перечисленных отличий компиляция в режиме отладки отключает большинство оптимизаций JIT-компилятора, которые выполняются во время выполнения, а также выдает более полную отладочную информацию в файл базы данных символов (.pdb).

Другое большое отличие состоит в том, что поведение GC несколько отличается тем, что JIT-компилятор вставляет вызовы в GC.KeepAlive () в зависимости от необходимости / необходимости для поддержки сеансов отладки.

13 голосов
/ 18 сентября 2008

Я не знаю ни одного краткого документа, но:

  • Отладка. Записать вызовы в Release
  • В Релизе ваш CallStack может выглядеть немного «странно» из-за оптимизации, как обрисовано в общих чертах Скотт Хансельман
9 голосов
/ 19 февраля 2014

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

http://msdn.microsoft.com/en-us/library/kwybya3w.aspx

Основные различия -

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

2.PDB-файл создается только в режиме отладки, а не в режиме выпуска.

3.В режиме выпуска cpde оптимизируется оптимизатором, встроенным в JIT-компилятор. Это делает следующие оптимизации:

• Встраивание метода - вызов метода заменяется введением кода метода.

• Распределение регистров ЦП. Локальные переменные и аргументы методов могут храниться в регистре ЦП без повторного (или менее частого) сохранения в фрейме стека.

• Исключение проверки индекса массива - важная оптимизация при работе с массивами (все классы коллекций .NET используют массив внутри). Когда JIT-компилятор может проверить, что цикл никогда не индексирует массив вне границ, он устраняет проверку индекса.

•   Loop unrolling -  Short loops (up to 4) with small bodies are eliminated by repeating the code in the loop body. 

•   Dead code elimination - A statement like if (false) { /.../ } gets completely eliminated. 

•   Code hoisting- Code inside a loop that is not affected by the loop can be moved out of the loop.

•   Common sub-expression elimination. x = y + 4; z = y + 4; becomes z = x
5 голосов
/ 24 февраля 2009

Одна из основных областей производительности, если вы используете какой-либо элемент управления ASP.NET Ajax: отладочная информация удаляется из библиотеки JavaScript при запуске в выпуске, и я видел значительные улучшения производительности на сложных страницах. Другие веб-ресурсы могут кэшироваться или не кэшироваться в зависимости от этого параметра.

Также помните, что отладка / выпуск в веб-приложении определяется файлом web.config, а не вашими настройками в Visual Studio.

<system.web>
    <compilation debug="true">

Дополнительная информация:

4 голосов
/ 18 сентября 2008

Рисование с использованием GDI + значительно медленнее в режиме отладки.

3 голосов
/ 27 июля 2013

Вы также можете управлять некоторой частью кода, которую вы хотите запустить только в отладке или только в выпуске с пометками препроцессора:

 #if DEBUG
    // Some code running only in debug
 #endif

или

 #if NOT DEBUG
    // Some code running only in release
 #endif
2 голосов
/ 18 сентября 2008

Версия выпуска:

  1. значительно быстрее (наиболее важно), оптимизировано

  2. невозможно отладить (шаг за шагом)

  3. и код, написанный в директиве "debug", не включен

См. В чем разница между сборкой Debug и Release Build? .

1 голос
/ 09 мая 2013

При распространении исполняемого файла на другой компьютер я получил сообщение об ошибке, указывающее, что система пропустила MSVCP110D.dll.

Решение этой проблемы указано в вопросе переполнения стека Отсутствует Visual Studio MSVCP110D.dll .

IN XXXXD.dll D означает, что файл DLL является отладочной версией файла DLL. Но распространяемые пакеты MS Visual C ++ включают только версию выпуска файлов DLL.

Это означает, что если вам нужно распространять программу, разработанную Visual C ++ , вам необходимо собрать ее в режиме выпуска. А также вам нужно установить распространяемый MS Visual C ++ (правильная версия ) на целевой машине.

Так что я думаю, что это одно из ключевых отличий между режимом отладки и выпуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...