Что мне дает PDB при отладке и как я знаю, что она работает? - PullRequest
7 голосов
/ 09 сентября 2008

Я должен использовать сторонний компонент без исходного кода. У меня есть релиз DLL и релиз файла PDB. Давайте назовем это «CorporateComponent.dll». Мой собственный код создает объекты из этой DLL и вызывает методы для этих объектов.

CorpObject o = new CorpObject();
Int32 result = o.DoSomethingLousy();

При отладке метод DoSomethingLousy вызывает исключение. Что файл PDB делает для меня? Если он делает что-то приятное, как я могу быть уверен, что использую это?

Ответы [ 4 ]

6 голосов
/ 10 сентября 2008

Чтобы убедиться, что вы используете предоставленный PDB, CorporateComponent.pdb, во время отладки в среде Visual Studio IDE просмотрите окно вывода и найдите строку, указывающую, что файл CorporateComponent.dll загружен, а затем строку Symbols loaded.

Чтобы проиллюстрировать мой проект:

The thread 0x6a0 has exited with code 0 (0x0).
The thread 0x1f78 has exited with code 0 (0x0).
'AvayaConfigurationService.vshost.exe' (Managed): Loaded 'C:\Development\Src\trunk\ntity\AvayaConfigurationService\AvayaConfigurationService\bin\Debug  \AvayaConfigurationService.exe', Symbols loaded.
'AvayaConfigurationService.vshost.exe' (Managed): Loaded 'C:\Development\Src\trunk\ntity\AvayaConfigurationService\AvayaConfigurationService\bin\Debug\IPOConfigService.dll', No symbols loaded.

Loaded 'C:\Development\src...\bin\Debug\AvayaConfigurationService.exe', Symbols loaded.

Это указывает на то, что PDB был найден и загружен отладчиком IDE.

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

5 голосов
/ 09 сентября 2008

Pdb содержит информацию, необходимую отладчику для правильного чтения стека. Ваши трассировки стека будут содержать номера строк и имена символов стековых фреймов внутри модулей, для которых у вас есть pdb.

Я приведу два примера использования. Первый - очевидный ответ. Вторая объясняет индексированные источником pdb.

1-й пример использования ...

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

Рассмотрим сценарий, в котором вы сталкиваетесь с нарушением доступа внутри ОС Windows. Трассировка стека не раскручивается в ваше собственное приложение, потому что этот компонент ОС использует специальное соглашение о вызовах, которое сбивает с толку отладчик. Если вы сконфигурируете свой путь символов для загрузки публичных pdb ОС, то есть большая вероятность, что трассировка стека развернется в вашем приложении. Это позволяет вам точно увидеть, какие аргументы ваш собственный код передал в системный вызов ОС. (и аналогичный пример для AV внутри сторонней библиотеки или даже внутри вашего собственного кода)

2-й пример использования ...

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

Установка «Средства отладки для Windows» (windbg) содержит документ с именем srcsrv.doc, в котором приведен пример, демонстрирующий, как использовать srctool.exe для определения того, какие исходные файлы индексируются в исходном формате в заданной pdb.

Чтобы ответить на ваш вопрос «откуда я знаю», функция «модули» в отладчике может сказать вам, какие модули имеют соответствующий pdb. В windbg используйте команду "lml". В visual studio выберите модули из меню отладки. (извините, у меня нет под рукой текущей версии visual studio)

4 голосов
/ 09 сентября 2008

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

0 голосов
/ 09 сентября 2008

Основное, что я получаю от pdb - это номера строк и реальные имена методов для трассировки стека.

...