Должен ли я скомпилировать сборки релиза с отладочной информацией как «полная» или «только для pdb»? - PullRequest
108 голосов
/ 10 октября 2011

В Visual Studio 2010 для проекта C #, если вы идете в Свойства проекта> Сборка> Дополнительно> Информация об отладке, у вас есть три варианта: ни один, ни полный, или только для pdb. Основываясь на ответе на этот вопрос , я полагаю, что я понимаю некоторые различия между full и pdb-only. Однако, что больше подходит для сборки релиза? Если я использую «полный», будут ли последствия для производительности? Если я использую «только pdb», будет ли труднее отлаживать производственные проблемы?

В чем разница между "full" и "pdbonly"? https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option

Ответы [ 4 ]

87 голосов
/ 10 октября 2011

Я бы построил с pdb-only.Вы не сможете прикрепить отладчик к выпущенному продукту, но если вы получите аварийный дамп, вы можете использовать Visual Studio или WinDBG для проверки трассировки стека и дампов памяти во время сбоя.

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

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

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

Примечание о производительности:

Оба Джон Роббинс и Эрик Липперт написали в блоге сообщения о флаге /debug, и оба они указывают, что этот параметр имеет ноль влияние на производительность .Существует отдельный флаг /optimize, который указывает, должен ли компилятор выполнять оптимизацию.

55 голосов
/ 11 марта 2015

ПРЕДУПРЕЖДЕНИЕ MSDN документация для переключателя / debug (в Visual Studio это информация об отладке) устарела!Вот что у него есть неверно

Если вы используете / debug: full , имейте в виду, что есть некоторое влияние на скорость и размерJIT-оптимизированный код и небольшое влияние на качество кода с / debug: full .Мы рекомендуем / debug: pdbonly или нет PDB для генерации кода выпуска.

Одно отличие между / debug: pdbonly и / debug: full это что с / debug: full компилятор испускает DebuggableAttribute, который используется, чтобы сообщить JIT-компилятору, что отладочная информация доступна.

Тогда, что теперь верно?

  1. Только для Pdb - До .NET 2.0 он помогал исследовать аварийные дампы из выпущенного продукта (клиентские машины).Но это не позволило подключить отладчик.Это не тот случай с .NET 2.0.Это точно так же, как Full .
  2. Full - Это помогает нам исследовать аварийные дампы, а также позволяет подключить отладчик к выпускустроить.Но в отличие от MSDN, это не влияет на производительность (начиная с .NET 2.0).Это точно так же, как Pdb-only .

Если они точно такие же, почему у нас есть эти опции?Джон Роббинс (Бог отладки окон) обнаружил они существуют по историческим причинам.

В .NET 1.0 были различия, но в .NET 2.0 их нет.Похоже, что .NET 4.0 будет следовать той же схеме.После двойной проверки с командой отладки CLR нет никакой разницы.

Что контролирует, выполняет ли JITter отладочную сборку, это ключ / optimize.<…>

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

, затем онПродолжаем доказывать это.

Теперь оптимизация является частью отдельного переключателя /optimize (в Visual Studio это называется Optimize code).

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

16 голосов
/ 10 октября 2011

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

Полная отладка добавляет атрибут [Debuggable] в ваш код.Это оказывает огромное влияние на скорость.Например, некоторые оптимизации цикла могут быть отключены, чтобы упростить один шаг.Кроме того, он оказывает небольшое влияние на процесс JIT, так как включает отслеживание.

4 голосов
/ 05 сентября 2013

Я нахожусь в процессе написания обработчика необработанных исключений, и трассировка стека включает номер строки, когда используется только pdb, в противном случае я просто получаю имя Sub / Function, когда выбираю None.

Если я не распространяю .pdb, я не получаю номер строки в трассировке стека даже со сборкой только для pdb.

Итак, я распространяю (XCOPY deployв локальной сети) pdb вместе с exe из моего приложения VB.

...