Отладка против выпуска в .NET.

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

Какие отличия существуют?

Ответ 1

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

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

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

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

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

Но вы можете:

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

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

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

Ответ 2

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

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

Ответ 3

Я не знаю одного сжатого документа, но:

  • Отладки Debug.Write удаляются в Release
  • В выпуске ваш CallStack может выглядеть немного странно из-за оптимизации, как описано Scott Hanselman

Ответ 4

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

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

Основные отличия -

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

Файл 2.PDB создается только в режиме отладки, а не в режиме relese.

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

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

• Распределение регистров CPU - Локальные переменные и аргументы метода могут оставаться в регистре CPU, но никогда (или реже) не сохраняются в фрейме стека

• Исправление проверки индекса массива - важная оптимизация при работе с массивами (все классы .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

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

Кроме того, помните, что Debug/Release в веб-приложении продиктован файлом web.config, а не вашими параметрами в Visual Studio.

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

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

Ответ 6

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

Ответ 8

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

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

или

 #if NOT DEBUG
    // Some code running only in release
 #endif

Ответ 9

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

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

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

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

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