다음을 통해 공유


Paged-Out 헤더에서 기호 읽기

커널 디버거는 해당 모듈에 해당하는 기호를 알기 위해 로드된 각 모듈 이미지의 헤더를 읽어야 합니다.

모듈의 헤더가 디스크로 페이징되는 경우 디버거는 이 모듈에 대한 기호를 로드하지 않습니다. 디버깅 프로세스에 필수적인 모듈에서 이 문제가 발생하면 심각한 문제가 될 수 있습니다.

다음 절차를 사용하여 이 문제를 해결할 수 있습니다.

페이징된 헤더에 대한 기호를 가져오려면

  1. 커널 자체의 두 번째 복사본을 만듭니다. 네트워크 공유에 배치하는 것이 가장 쉬울 수 있습니다.

  2. 이 공유의 루트 디렉터리를 기호 경로에 추가합니다. 기호 경로를 변경하는 방법은 기호 경로를 참조하세요.

  3. .reload(모듈 다시 로드) 명령을 사용합니다.

  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