Что дает мне PDB во время отладки и как я узнаю, что он работает?

StackOverflow https://stackoverflow.com/questions/52600

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Чтобы подтвердить, используете ли вы предоставленную PDB, CorporateComponent.pdb, во время отладки в среде IDE Visual Studio просмотрите окно вывода и найдите строку, указывающую, что 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.Если вы этого не сделаете, то, возможно, сторонняя компания не включила информацию о символах в сборку базы данных release PDB.

Другие советы

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)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top