Поделиться через


Чтение символов из заголовков Paged-Out

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

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

Для решения этой проблемы можно использовать следующую процедуру.

Получение символов для заголовков с выходом на страницы

  1. Создайте вторую копию самого ядра. Вероятно, проще всего поместить его в сетевую папку.

  2. Добавьте корневой каталог этой общей папки в путь к символу. Способы изменения пути к символам см. в разделе Путь к символу.

  3. Используйте команду .reload (Reload Module).

  4. Используйте команду !sym noisy extension, чтобы просмотреть более подробные выходные данные. Если этот параметр используется, вы сможете увидеть, какие символы загружаются из образов модулей на целевом компьютере, а какие — из копии модулей ядра.

Этот метод следует использовать с осторожностью, так как отладчик не может проверить, соответствуют ли копии файлов оригиналам. Поэтому очень важно, чтобы версия Windows, используемая в сетевой папке, соответствовала версии, используемой на целевом компьютере.

Этот метод используется только для отладки в режиме ядра. Операционная система может выполнять разбиение по страницам в любых заголовках, необходимых во время отладки в пользовательском режиме (если диск, содержащий файл подкачки, не отключен или иным образом недоступен).

Ниже приведен пример используемого метода:

kd> .reload
Connected to Windows XP 2268 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
..........Unable to read image header for dmload.sys at fe0be000 - NTSTATUS 0xC0000001
..........Unable to read image header for dmboot.sys at fda93000 - NTSTATUS 0xC0000001
.....................................Unable to read image header for fdc.sys at fdfc2000 - NTSTATUS 0xC0000001
...Unable to read image header for flpydisk.sys at fde4a000 - NTSTATUS 0xC0000001
.Unable to read image header for Fs_Rec.SYS at fe0c8000 - NTSTATUS 0xC0000001
.Unable to read image header for Null.SYS at fe2c4000 - NTSTATUS 0xC0000001
...................Unable to read image header for win32k.sys at a0000000 - NTSTATUS 0xC0000001
..Unable to read image header for dxg.sys at a0194000 - NTSTATUS 0xC0000001
.......Unable to read image header for ati2draa.dll at a01a4000 - NTSTATUS 0xC0000001
..Unable to read image header for ParVdm.SYS at fe116000 - NTSTATUS 0xC0000001
.......
Loading unloaded module list
..............
Loading User Symbols
Unable to retrieve the PEB address. This is usually caused
by being in the wrong process context or by paging

Обратите внимание, что многие изображения имеют недоступные заголовки. Проверьте символы из одного из этих файлов (в этом примере fs_rec.sys):

kd> x fs_rec!*
*** ERROR: Module load completed but symbols could not be loaded for fs_rec.sys

Эти заголовки, по-видимому, выстраивается. Поэтому необходимо добавить соответствующие изображения в путь символа:

kd> .sympath+ \\myserver\myshare\symbols\x86fre\symbols
Symbol search path is: symsrv*symsrv.dll*c:\localcache*https://msdl.microsoft.com/download/symbols;\\myserver\myshare\symbols\x86fre\symbols

kd> .reload
Connected to Windows XP 2268 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
..........Unable to read image header for dmload.sys at fe0be000 - NTSTATUS 0xC0000001
..........Unable to read image header for dmboot.sys at fda93000 - NTSTATUS 0xC0000001
.....................................Unable to read image header for fdc.sys at fdfc2000 - NTSTATUS 0xC0000001
...Unable to read image header for flpydisk.sys at fde4a000 - NTSTATUS 0xC0000001
.Unable to read image header for Fs_Rec.SYS at fe0c8000 - NTSTATUS 0xC0000001
.Unable to read image header for Null.SYS at fe2c4000 - NTSTATUS 0xC0000001
...................Unable to read image header for win32k.sys at a0000000 - NTSTATUS 0xC0000001
..Unable to read image header for dxg.sys at a0194000 - NTSTATUS 0xC0000001
.......Unable to read image header for ati2draa.dll at a01a4000 - NTSTATUS 0xC0000001
..Unable to read image header for ParVdm.SYS at fe116000 - NTSTATUS 0xC0000001
.......
Loading unloaded module list
..............
Loading User Symbols
Unable to retrieve the PEB address. This is usually caused
by being in the wrong process context or by paging

Появились те же предупреждения, но сами символы теперь доступны:

kd> x fs_Rec!*
fe0c8358  Fs_Rec!_imp___allmul
fe0c8310  Fs_Rec!_imp__IoCreateDevice
fe0c835c  Fs_Rec!_imp___allshr
........
fe0c8360  Fs_Rec!ntoskrnl_NULL_THUNK_DATA
fe0c832c  Fs_Rec!_imp__KeSetEvent
fe0c9570  Fs_Rec!_NULL_IMPORT_DESCRIPTOR