2009-03-11 2 views
4

Если версия выпуска создает файлы .pdb, и вы можете входить в каждую строку, ставить точки останова и т. Д., То зачем вообще создавать «отладочную» версию моих компонентов?C# - Есть ли необходимость в отладочной сборке .net

Я использую C# для своих проектов, и у меня не было проблем с отладочной версией выпуска. В C++ у меня проблемы с отладкой оптимизированного кода, но на C# он отлично работает. Я не говорю о глупых кодовых блоках, таких как if(false) ...

ответ

7

Одной из причин является установка против запуска.

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

Attach - совершенно другая игра в мяч. Оба C# и VB передаются флагом/optimize + для розничных сборок. Это будет встраивать DebuggableAttribute на уровне сборки без флага DebuggingMode.DisableOptimizations. Во время запуска процесса VS/CLR будет связываться, чтобы по существу игнорировать этот факт и отключить оптимизацию JIT, влияющую на отладку. Во время подключения нет такого элемента, и JIT/CLR будет оптимизировать его содержание. Я гарантирую, что в этом случае опыт отладки намного хуже.

Вы можете поэкспериментировать с этим в VS

  • Переключатель сборки освободить
  • CTRL + F5 для запуска, без отладки
  • Присоединить к процессу.
+0

Вы имеете в виду Освобождение, а не Розничный ...? – Matt

+0

@Matt, да, VS использует Release – JaredPar

8

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

5

В (C#) WinForms вы не можете редактировать & продолжать выпуск строит ..

0

релиза сборки выполнить дополнительную оптимизацию, чем отладка сборок, однако отладочная сборка также слегка изменяет поведение GC, чтобы гарантировать, что вы не получите объект, собранный из-под вас, когда вы находитесь в середине сеанса отладки. Отладочные сборки также предотвращают определенные оптимизации во время JIT, которые окажут негативное влияние на ваш сеанс отладки.

+0

Разве это не особенность компилятора JIT, а не GC? –

2

Есть несколько причин:

  • По умолчанию сборка выпуска не включает в себя как можно больше информации об отладке в PDB-файл. Я считаю, что вариант для этого раньше был более заметным - теперь он находится в разделе «Дополнительные настройки» в разделе «Вывод» с возможными значениями «none», «full» (по умолчанию для отладочных сборников) и «pdb-only» (по умолчанию для выпуска строит).
  • По умолчанию оптимизатор выпуска оптимизирован: хотя это не делает почти такой же большой разницы в C#, как и на других языках (например, C++) из-за того, что JIT делает большую часть работы, может быть различий что затрудняет отладку сборки релиза.
  • По умолчанию сборка выпуска не определяет символ DEBUG, поэтому любые вызовы Debug.Assert и т. Д. Будут удалены.

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

+0

Я считаю, что вы неверны в первой точке. PDB включены в конфигурацию VS по умолчанию для сборки релиза (проверяется с помощью консольного приложения). Во время отладки было бы невозможно предоставить информацию о местных жителей. – JaredPar

+0

Ooh ... проверка сейчас. –

+0

Хм ... странно. Интересно, откуда у меня эта идея. Редактирование. –

3

Помимо других ответов, я использую автоматически #define DEBUG изменить поведение при неперехваченное Исключение происходит:

  • При работе в режиме выпуска, показывают хорошее сообщение пользователю и необязательно регистрировать ошибку,
  • при работе в режиме отладки, ничего (что приведет к сбою в отладчик)
0

Я согласен с Lennaert не делать - я, как правило, делать различную обработку ошибок между сборками. Например, для некоторых приложений я супер анал в сборке отладки. Предварительные и пост-условия, утверждения, исключения и т. Д. Я в основном пытаюсь заставить разработчика правильно использовать мою библиотеку. С другой стороны, в релиз-сборке я расслабляю условия для повышения производительности.

0

При использовании Проектирования по контракту, важно иметь две сборку - выпуск один, который не проверяет Предусловий, Постусловия и Инвариантов класса и отлаживать один, который проверяет их (с помощью утверждений).

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

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