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

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

0

1 ответы

To match symbols to binary, WinDbg looks at the thing called Debug Directories. Debug Directories are sections in PE modules (which is a file format used by Windows for all types of executables). Debug Directories simply contain links to types of debug information. If you type command in cmd window link /dump /headers , it will print out something like this:

...
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.

2
добавлено
Каждый модуль PE имеет свой собственный файл символов. Существует не такая вещь, как «символы для ОС», поскольку ОС состоит из смеси версий из разных пакетов обновлений, исправлений, горячих исправлений, частных двоичных файлов и т. Д.
добавлено автор seva titov, источник
Опять же, нет «символов ОС», есть символы для конкретного модуля PE. Дамп содержит список модулей, отображаемых в настоящее время в адресное пространство процесса. Существуют разные версии kernel32.dll - для разных архитектур процессоров ОС, в других версиях есть разные исправления ОС. Когда отладчику необходимо разрешить символы для kernel32.dll, он просматривает структуру информации модуля, которая создается загрузчиком в момент, когда модуль первоначально загружался в процесс. Эта информация содержит некоторые разделы из образа PE, включая Debug Directory.
добавлено автор seva titov, источник
Вы имеете в виду эту информацию, является частью модулей PE, встроенных в сборки? Когда я создаю приложение, я могу запустить его на разных ОС с различными пакетами обновлений. Я смущен тем, как эту информацию, хранящуюся в PE-модуле, можно использовать, когда само приложение работает на разных ОС.
добавлено автор Silverlight Student, источник
Скажем, сборка приложений была скомпилирована в Vista. Я создаю дамп для него в Windows 7 и еще один для Windows Server 2008. В этом случае модуль PE будет иметь идентификатор для Vista, правильно? Как два дампа будут получать символы для Windows 7 и 2008 в этом случае?
добавлено автор Silverlight Student, источник