Есть ли необходимость отладочной сборки в.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, что отрицательно скажется на вашем сеансе отладки.