Выпуск, генерирующий .pdb файлы, почему? - PullRequest
243 голосов
/ 28 марта 2011

Почему Visual Studio 2005 генерирует файлы .pdb при компиляции в выпуске?Я не буду отлаживать сборку релиза, так почему они генерируются?

Ответы [ 9 ]

394 голосов
/ 28 марта 2011

Поскольку без файлов PDB было бы невозможно отладить сборку "Release" с помощью чего-либо, кроме отладки на уровне адресов. Оптимизации действительно сильно влияют на ваш код, что делает его очень трудным для поиска виновник, если что-то пойдет не так (скажем, исключение выдается). Даже установка точек останова чрезвычайно трудна, потому что строки исходного кода не могут быть сопоставлены один к одному (или даже в том же порядке, что и) сгенерированного кода сборки. Файлы PDB помогают вам и отладчику значительно упростить отладку после вскрытия.

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

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

  2. Клиенты часто сообщают о крайних случаях и ошибках, которые возникают только в «идеальных» условиях. Это вещи, которые практически невозможно воспроизвести в лаборатории, потому что они полагаются на какую-то дурацкую конфигурацию компьютера этого пользователя. Если они особенно полезные клиенты, они сообщат об исключении, которое было сгенерировано, и предоставят вам трассировку стека. Или они даже позволят вам одолжить их машину для удаленной отладки программного обеспечения. В любом из этих случаев вам понадобятся файлы PDB.

  3. Профилирование должно всегда выполняться в сборках "Release" с включенной оптимизацией. И снова, файлы PDB пригодятся, потому что они позволяют отображать профилированные инструкции по сборке обратно в исходный код, который вы на самом деле написали.

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

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

Обратите внимание, однако, что конфигурации «Debug» и «Release» do по умолчанию используют разные параметры для выдачи отладочной информации. Вы хотите сохранить эту настройку. Параметр «Информация отладки» установлен на «полный» для сборки отладки, что означает, что в дополнение к файлу PDB информация об символах отладки встроена в сборку. Вы также получаете символы, которые поддерживают интересные функции, такие как редактирование и продолжение. В режиме Release выбран параметр «только для pdb», который, как это звучит, включает в себя только файл PDB, не затрагивая содержимое сборки. Так что это не так просто, как простое присутствие или отсутствие файлов PDB в вашем каталоге /bin. Но при условии, что вы используете опцию «pdb-only», наличие файла PDB никоим образом не повлияет на производительность вашего кода во время выполнения.

* Как Марк Шерман указывает в комментарии , если ваш исходный код не изменился (или вы можете получить исходный код из системы контроля версий).система), вы можете восстановить его и создать соответствующий файл PDB.По крайней мере, обычно.В большинстве случаев это работает хорошо, но компилятору не гарантируется генерирование идентичных двоичных файлов каждый раз, когда вы компилируете один и тот же код , поэтому может иметь небольшие различия.Хуже того, если вы сделали какие-либо обновления в своей цепочке инструментов (например, применили пакет обновления для Visual Studio), вероятность того, что PDB будут совпадать, еще меньше.Чтобы гарантировать надежное создание файлов ex postfacto PDB, вам потребуется архивировать не только исходный код в вашей системе управления версиями, но и двоичные файлы для всего набора инструментов сборки, чтобы обеспечить точное воссозданиеконфигурация вашей среды сборки.Само собой разумеется, что гораздо проще просто создавать и архивировать файлы PDB.

81 голосов
/ 28 марта 2011

PDB может быть сгенерировано как для Release, так и для Debug. Это установлено в (в VS2010, но в VS2005 должно быть аналогичным):

Проект → Свойства → Сборка → Дополнительно → Отладочная информация

Просто измените его на None.

8 голосов
/ 29 ноября 2012

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

7 голосов
/ 28 марта 2011

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

4 голосов
/ 20 января 2015

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

.
2 голосов
/ 23 мая 2014

.PDB файл - это короткое имя «База данных программы».Он содержит информацию о точке отладки для отладчика и используемых ресурсах или ссылки.Он генерируется при сборке в режиме отладки.Это позволяет приложению отлаживать во время выполнения.

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

Хорошая статья файла pdb.

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P

1 голос
/ 30 декабря 2015

В многопроектном решении вы обычно хотите иметь одну конфигурацию, которая вообще не генерирует файлы PDB или XML.Вместо того, чтобы изменять свойство Debug Info каждого проекта на none, я подумал, что было бы более целесообразно добавить событие после сборки, которое работает только в определенной конфигурации.

К сожалению, Visual Studio не 't позволяет вам указывать разные события после сборки для разных конфигураций.Поэтому я решил сделать это вручную, отредактировав файл csproj запускаемого проекта и добавив следующее (вместо любого существующего тега PostBuildEvent):

  <PropertyGroup Condition="'$(Configuration)' == 'Publish'">
    <PostBuildEvent>
        del *.pdb
        del *.xml
    </PostBuildEvent>
  </PropertyGroup>

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

0 голосов
/ 08 мая 2019

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

И поэтому наличие PDB улучшает отчеты о сбоях.

0 голосов
/ 07 ноября 2017

Файлы символов отладки ( .pdb) и файлы XML doc ( .xml) составляют большой процент от общего размера и не должны быть частью обычного пакета развертывания.Но должна быть возможность доступа к ним в случае необходимости.

Один из возможных подходов: в конце процесса сборки TFS переместите их в отдельный артефакт.

...