Partilhar via


Lendo símbolos de cabeçalhos Paged-Out

O depurador de kernel deve ler o cabeçalho da imagem de cada módulo carregado para saber quais símbolos correspondem a esse módulo.

Se o cabeçalho de um módulo for paginado para o disco, o depurador não carregará símbolos para este módulo. Se isso acontecer com um módulo essencial para o processo de depuração, ele poderá ser um problema crítico.

O procedimento a seguir pode ser usado para resolver esse problema.

Para adquirir símbolos para cabeçalhos paginado

  1. Faça uma segunda cópia do kernel em si. Provavelmente é mais fácil colocar isso em um compartilhamento de rede.

  2. Acrescente o diretório raiz desse compartilhamento ao caminho do símbolo. Confira Caminho do Símbolo para ver as maneiras de alterar o caminho do símbolo.

  3. Use o comando .reload (Módulo recarregar).

  4. Use o comando !sym noisy extension para ver uma saída mais detalhada. Se isso for usado, você poderá ver quais símbolos são carregados das imagens do módulo no computador de destino e que são carregados da cópia dos módulos do kernel.

Essa técnica deve ser usada com cuidado, pois o depurador não tem como verificar se as cópias de arquivo realmente correspondem aos originais. Portanto, é crucial que a versão do Windows usada no compartilhamento de rede corresponda à versão usada no computador de destino.

Essa técnica só é usada para depuração no modo kernel. O sistema operacional é capaz de paginar em todos os cabeçalhos necessários durante a depuração do modo de usuário (a menos que o disco que contém o arquivo de paginação seja desmontado ou inacessível).

Aqui está um exemplo dessa técnica que está sendo usada:

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

Observe que muitas imagens têm cabeçalhos inacessíveis. Verifique os símbolos de um desses arquivos (neste exemplo, fs_rec.sys):

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

Esses cabeçalhos são aparentemente paginado. Portanto, você precisa adicionar as imagens adequadas ao caminho do símbolo:

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

Os mesmos avisos apareceram, mas os símbolos em si agora estão acessíveis:

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