Есть ли необходимость отладочной сборки в.net?

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

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

8 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Когда вы используете Design by Contract, важно иметь две сборки - релизную, которая не проверяет Предварительные условия, Постусловия и инварианты классов, и отладочную, которая проверяет их (посредством утверждений).

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

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

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

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

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