как windbg определяет, какие символы ОС загружать для файла дампа

#debugging #windbg #symbols

#отладка #windbg #символы

Вопрос:

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

Ответ №1:

Чтобы сопоставить символы с двоичными, WinDbg просматривает то, что называется каталогами отладки. Каталоги отладки — это разделы в модулях 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.

Комментарии:

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

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

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

4. Опять же, нет «символов ОС», есть символы для конкретного модуля PE. Дамп содержит список модулей, которые в данный момент сопоставлены с адресным пространством процесса. Существуют разные версии kernel32.dll — для разных процессорных архитектур ОС другие версии поставляются с различными исправлениями ОС. Когда отладчику необходимо разрешить символы для kernel32.dll , он просматривает информационную структуру модуля, которая создается загрузчиком в то время, когда модуль первоначально был загружен в процесс. Эта информация содержит некоторые разделы из PE-образа, включая каталог Debug.