Freigeben über


Lesen von Symbolen aus Paged-Out Headern

Der Kerneldebugger muss den Header für das Image jedes geladenen Moduls lesen, um zu wissen, welche Symbole diesem Modul entsprechen.

Wenn der Header eines Moduls auf den Datenträger ausgelagert wird, lädt der Debugger keine Symbole für dieses Modul. Wenn dies bei einem Modul geschieht, das für den Debugprozess unerlässlich ist, kann dies ein kritisches Problem sein.

Das folgende Verfahren kann verwendet werden, um dieses Problem zu lösen.

So erhalten Sie Symbole für ausgelagerte Kopfzeilen

  1. Erstellen Sie eine zweite Kopie des Kernels selbst. Es ist wahrscheinlich am einfachsten, dies auf eine Netzwerkfreigabe zu setzen.

  2. Fügen Sie das Stammverzeichnis dieser Freigabe an den Symbolpfad an. Informationen zum Ändern des Symbolpfads finden Sie unter Symbolpfad .

  3. Verwenden Sie den Befehl .reload (Modul neu laden).

  4. Verwenden Sie den Befehl der verrauschten Erweiterung !sym , um eine ausführlichere Ausgabe anzuzeigen. Wenn dies verwendet wird, können Sie sehen, welche Symbole aus den Modulimages auf dem Zielcomputer geladen werden und welche aus der Kopie der Kernelmodule geladen werden.

Dieses Verfahren muss mit Sorgfalt verwendet werden, da der Debugger nicht überprüfen kann, ob die Dateikopien tatsächlich mit den Originalen übereinstimmen. Daher ist es von entscheidender Bedeutung, dass die Version von Windows, die auf der Netzwerkfreigabe verwendet wird, mit der auf dem Zielcomputer verwendeten Version übereinstimmt.

Dieses Verfahren wird nur für das Debuggen im Kernelmodus verwendet. Das Betriebssystem kann alle Header auslagern, die während des Debuggens im Benutzermodus erforderlich sind (es sei denn, der Datenträger, auf dem sich die Auslagerungsdatei befindet, ist aufgehoben oder anderweitig nicht zugänglich).

Hier sehen Sie ein Beispiel für diese Technik, die verwendet wird:

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

Beachten Sie, dass auf viele Bilder nicht zugegriffen werden kann. Überprüfen Sie die Symbole aus einer dieser Dateien (in diesem Beispiel fs_rec.sys):

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

Diese Kopfzeilen sind anscheinend ausgelagert. Daher müssen Sie dem Symbolpfad die richtigen Bilder hinzufügen:

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

Es wurden dieselben Warnungen angezeigt, aber die Symbole selbst sind jetzt zugänglich:

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