Símbolos de asignación Cuando el PEB está paginado fuera
Para cargar símbolos, el depurador examina la lista de módulos cargados por el sistema operativo. El puntero a la lista de módulos en modo de usuario es uno de los elementos almacenados en el bloque de entorno de proceso (PEB).
Para reclamar memoria, el Administrador de memoria puede paginar los datos en modo de usuario para crear espacio para otros componentes del modo de proceso o kernel. Los datos en modo de usuario que se paginan pueden incluir la estructura de datos PEB. Sin esta estructura de datos, el depurador no puede determinar para qué imágenes se van a cargar símbolos.
Nota Esto afecta solo a los archivos de símbolos para los módulos en modo de usuario. Los módulos y símbolos en modo kernel no se ven afectados, ya que se realiza un seguimiento en una lista diferente.
Supongamos que un módulo en modo de usuario se asigna al proceso actual y desea corregir los símbolos para él. Busque cualquier dirección en el intervalo de direcciones virtuales del módulo. Por ejemplo, supongamos que un módulo se asigna a un intervalo de direcciones virtuales que contiene la dirección 7f78e9e000F. Escriba el comando siguiente.
3: kd> !vad 7f78e9e000F 1
La salida del comando muestra información sobre el descriptor de direcciones virtuales (VAD) del módulo. La salida del comando también incluye una cadena de comando Reload que puede usar para cargar los símbolos del módulo. La cadena de comando Reload incluye la dirección inicial (000007f7'8e9e0000) y el tamaño (32000) del módulo del Bloc de notas.
VAD @ fffffa80056fb960
...
Reload command: .reload notepad.exe=000007f7`8e9e0000,32000
Para cargar los símbolos, escriba el comando proporcionado en la cadena de comandos Reload.
.reload notepad.exe=000007f7`8e9e0000,32000
Este es otro ejemplo que usa una técnica ligeramente diferente. En el ejemplo se muestra cómo usar la extensión !vad para asignar símbolos cuando se pagina el PEB. La idea básica es buscar la dirección inicial y el tamaño del archivo DLL pertinente para que pueda usar el comando .reload para cargar los símbolos necesarios. Supongamos que la dirección del proceso actual es 0xE0000126'01BA0AF0 y desea corregir los símbolos para él. En primer lugar, use el comando !process para obtener la dirección raíz del descriptor de direcciones virtuales (VAD):
kd> !process e000012601ba0af0 1
PROCESS e000012601ba0af0
SessionId: 2 Cid: 0b50 Peb: 6fbfffde000 ParentCid: 0efc
DirBase: 079e8461 ObjectTable: e000000600fbceb0 HandleCount: 360.
Image: explorer.exe
VadRoot e000012601a35e70 Vads 201 Clone 0 Private 917. Modified 2198. Locked 0.
...
A continuación, use la extensión !vad para enumerar el árbol VAD asociado al proceso. Esos VAD etiquetados como "EXECUTE_WRITECOPY" pertenecen a los módulos de código.
kd> !vad e000012601a35e70
VAD level start end commit
...
e0000126019f9790 ( 6) 3fff0 3fff7 -1 Private READONLY
e000012601be1080 ( 7) 37d9bd30 37d9bd3e 2 Mapped Exe EXECUTE_WRITECOPY <-- these are DLLs
e000012600acd970 ( 5) 37d9bec0 37d9bece 2 Mapped Exe EXECUTE_WRITECOPY
e000012601a5cba0 ( 7) 37d9c910 37d9c924 2 Mapped Exe EXECUTE_WRITECOPY
...
A continuación, vuelva a usar la extensión !vad para buscar la dirección inicial y el tamaño de la memoria paginada que contiene el archivo DLL de interés. Esto confirma que ha encontrado el archivo DLL correcto:
kd> !vad e000012601be1080 1
VAD @ e000012601be1080
Start VPN: 37d9bd30 End VPN: 37d9bd3e Control Area: e00001260197b8d0
First ProtoPte: e0000006013e00a0 Last PTE fffffffffffffffc Commit Charge 2 (2.)
Secured.Flink 0 Blink 0 Banked/Extend: 0
File Offset 0
ImageMap ViewShare EXECUTE_WRITECOPY
...
File: \Windows\System32\ExplorerFrame.dll
El campo "Iniciar VPN" (en este caso, 0x37D9BD30) indica el número de página virtual inicial. Esto se debe convertir en una dirección real multiplicando por el tamaño de página. Puede usar el ? (Evaluar expresión) comando para multiplicar este valor por 0x2000, que es el tamaño de página del equipo basado en Itanium del que procede el ejemplo.
kd> ? 37d9bd3e*2000
Evaluate expression: 7676040298496 = 000006fb`37a7c000
A continuación, el tamaño del intervalo se puede convertir en bytes:
kd> ? 37d9bd3e-37d9bd30+1 <-- computes the number of pages
Evaluate expression: 15 = 00000000`0000000f
kd> ? f*2000
Evaluate expression: 122880 = 00000000`0001e000
Por lo tanto, ExplorerFrame.dll comienza en la dirección 0x000006Fb'37A7C000 y es 0x1E000 bytes grandes. Puede cargar sus símbolos con:
kd> .reload /f ExplorerFrame.dll=6fb`37a7c000,1e000