.thread (Establecer contexto de registro)
El comando .thread especifica qué subproceso se usará para el contexto de registro.
.thread [/p [/r] ] [/P] [/w] [Thread]
Parámetros
/p
(Solo depuración activa) Si se incluye esta opción y Thread no es igual a cero, todas las entradas de la tabla de páginas de transición (PTE) para el proceso propietario de este subproceso se traducirán automáticamente en direcciones físicas antes del acceso. Esto puede provocar ralentizaciones, ya que el depurador tendrá que buscar las direcciones físicas para toda la memoria usada por este proceso y es posible que sea necesario transferir una cantidad significativa de datos a través del cable de depuración. (Este comportamiento es el mismo que el de . cache forcedecodeuser.)
Si se incluye la opción /p y Thread es igual a cero o se omite, esta traducción se deshabilitará. (Este comportamiento es el mismo que el de . cache noforcedecodeuser.)
/r
(Solo depuración activa) Si la opción /r se incluye junto con la opción /p, los símbolos en modo de usuario para el proceso propietario de este subproceso se volverán a cargar después de que se hayan establecido los contextos de proceso y registro. (Este comportamiento es el mismo que el de .reload /user.)
/P
(Solo depuración activa) Si se incluye esta opción y Thread no es igual a cero, todas las entradas de la tabla de páginas de transición (PTE) se traducirán automáticamente en direcciones físicas antes del acceso. A diferencia de la opción /p , esto traduce los PTE para todos los procesos en modo de usuario y en modo kernel, no solo el proceso que posee este subproceso. Esto puede provocar ralentizaciones, ya que el depurador tendrá que buscar las direcciones físicas para toda la memoria en uso y es posible que sea necesario transferir una gran cantidad de datos a través del cable de depuración. (Este comportamiento es el mismo que el de . cache forcedecodeptes.)
/w
(solo depuración de kernel de 64 bits) Cambia el contexto activo del subproceso al contexto WOW64 de 32 bits. El subproceso especificado debe ejecutarse en un proceso que tenga un estado WOW64.
Hilo
Dirección del subproceso. Si se omite o es igual a cero, el contexto del subproceso se restablece al subproceso actual.
Entorno
Elemento | Descripción |
---|---|
Modos | solo modo kernel |
Destinos | en tiempo real, volcado de memoria |
Platforms | all |
Información adicional
Para obtener más información sobre el contexto de registro y otras configuraciones de contexto, consulte Cambiar contextos.
Comentarios
Por lo general, cuando se realiza la depuración de kernel, los únicos registros visibles son los asociados al subproceso actual.
El comando .thread indica al depurador de kernel que use el subproceso especificado como contexto de registro. Una vez ejecutado este comando, el depurador tendrá acceso a los registros más importantes y al seguimiento de la pila de este subproceso. Este contexto de registro persiste hasta que se permite que el destino se ejecute o use otro comando de contexto de registro (.thread, .cxr, o .trap). Consulte Contexto de registro para obtener más información.
La opción /w solo se puede usar en sesiones de depuración de kernel de 64 bits en un subproceso que se ejecuta en un proceso que tiene un estado WOW64. El contexto recuperado será el último contexto recordado por WOW64; suele ser el último código en modo de usuario ejecutado por Thread. Esta opción solo se puede usar si el destino está en modo de máquina nativa. Por ejemplo, si el destino se ejecuta en una máquina de 64 bits que emula un procesador basado en x86 mediante WOW64, no se puede usar esta opción. El uso de la opción /w hará que el modo de la máquina cambie automáticamente a un procesador basado en x86.
Este comando no cambia realmente el subproceso actual. En otras palabras, las extensiones como !thread y !teb seguirán teniendo como valor predeterminado el subproceso actual si no se usan argumentos con ellos.
A continuación se muestra un ejemplo: Use la extensión !process para buscar la dirección del subproceso deseado. (En este caso, !process 0 0 se usa para enumerar todos los procesos, !process se usa a continuación para enumerar todos los subprocesos del proceso deseado).
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0 SessionId: 0 Cid: 0008 Peb: 00000000 ParentCid: 0000
DirBase: 00030000 ObjectTable: fe529a88 TableSize: 145.
Image: System
.....
PROCESS ffaa5280 SessionId: 0 Cid: 0120 Peb: 7ffdf000 ParentCid: 01e0
DirBase: 03b70000 ObjectTable: ffaa4e48 TableSize: 23.
Image: winmine.exe
kd> !process ffaa5280
PROCESS ffaa5280 SessionId: 0 Cid: 0120 Peb: 7ffdf000 ParentCid: 01e0
DirBase: 03b70000 ObjectTable: ffaa4e48 TableSize: 23.
Image: winmine.exe
VadRoot ffaf6e48 Clone 0 Private 50. Modified 0. Locked 0.
DeviceMap fe502e88
Token e1b55d70
.....
THREAD ffaa43a0 Cid 120.3a4 Teb: 7ffde000 Win32Thread: e1b4fea8 WAIT: (WrUserRequest) UserMode Non-Alertable
ffadc6a0 SynchronizationEvent
Not impersonating
Owning Process ffaa5280
WaitTime (seconds) 24323
Context Switch Count 494 LargeStack
.....
Ahora use el comando .thread con la dirección del subproceso deseado. Esto establece el contexto de registro y le permite examinar los registros importantes y la pila de llamadas para este subproceso.
kd> .thread ffaa43a0
Using context of thread ffaa43a0
kd> r
Last set context:
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=80403a0d esp=fd581c2c ebp=fd581c60 iopl=0 nv up di pl nz na pe nc
cs=0000 ss=0000 ds=0000 es=0000 fs=0000 gs=0000 efl=00000000
0000:3a0d ?? ???
kd> k
*** Stack trace for last set context - .thread resets it
ChildEBP RetAddr
fd581c38 8042d61c ntoskrnl!KiSwapThread+0xc5
00001c60 00000000 ntoskrnl!KeWaitForSingleObject+0x1a1