共用方式為


從 Paged-Out 標頭讀取符號

核心偵錯工具必須讀取每個載入模組映射的標頭,才能知道哪個符號對應至該模組。

如果模組的標頭分頁到磁片,偵錯工具將不會載入此模組的符號。 如果這是偵錯程式不可或缺的模組所發生,可能是重大問題。

下列程式可用來解決此問題。

取得分頁標頭的符號

  1. 製作核心本身的第二個複本。 將它放在網路共用上可能最簡單的方法。

  2. 將這個共用的根目錄附加至符號路徑。 如需變更符號路徑的方式,請參閱 符號 路徑。

  3. 使用 .reload (Reload Module) 命令。

  4. 使用 !sym 雜訊 擴充命令來查看更詳細的輸出。 如果使用此功能,您將能夠查看從目的電腦上的模組映射載入的符號,以及從核心模組複本載入的符號。

這項技術必須謹慎使用,因為偵錯工具無法驗證檔案複本是否實際符合原始檔。 因此,網路共用上所使用的 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