2011-10-27 3 views
0

Когда я делаю анализ файла дампа, я настраиваю путь к символу, чтобы указать на сервер символов Microsoft. Как windbg знает, что файл дампа был сгенерирован под какой ОС и как он загружает правильные символы для этой ОС?Как windbg определяет, какие символы OS загружаются для файла дампа

ответ

2

Чтобы сопоставить символы с бинарными, WinDbg смотрит на объекты под названием Debug Directories. Отладочные каталоги - это разделы в PE-модулях (формат файлов, используемый Windows для всех типов исполняемых файлов). Отладочные каталоги просто содержат ссылки на типы отладочной информации. Если ввести команду в CMD окне link /dump /headers <my_module_name>, он выдаст что-то вроде этого:

... 
Debug Directories 

    Time Type  Size  RVA Pointer 
-------- ------ -------- -------- -------- 
4CC78FB1 cv   22 00102588 101988 Format: RSDS, {30976E0B-FBF7-45EF-8608-99932F2B791F}, 2, ntdll.pdb 
4CC78FB1 ( A)  4 00102584 101984 BB03197E 

... 

Это выход для ntdll.dll. Вы можете видеть, что отладочная информация CV (для CodeView) содержится в файле ntdll.pdb, а GUID этого PDB должен совпадать с идентификатором в ссылке. Этот GUID генерируется случайным образом для каждого модуля во время сборки.

Команда !lmi в WinDbg также выведет эту информацию в другом формате.

Что делает WinDbg при загрузке символов с сервера символов, он отправляет запрос на сервер символов для получения файла с именем 'ntdll.pdb' с соответствующим GUID.

+0

Вы хотите сказать, что это часть модулей PE, встроенных в сборки? Когда я создаю приложение, я могу запустить его на разных ОС с различными пакетами обновлений. Я смущен тем, как эту информацию, хранящуюся в PE-модуле, можно использовать, когда само приложение работает на разных ОС. –

+0

Каждый PE-модуль имеет свой собственный файл символов. Существует не такая вещь, как «символы для ОС», поскольку ОС состоит из смеси версий из разных пакетов обновлений, исправлений, горячих исправлений, частных двоичных файлов и т. Д. –

+0

Скажем, сборка приложений была скомпилирована в Vista. Я создаю дамп для него в Windows 7 и еще один для Windows Server 2008. В этом случае модуль PE будет иметь идентификатор для Vista, правильно? Как два дампа будут получать символы для Windows 7 и 2008 в этом случае? –

Смежные вопросы