Compartir a través de


.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.

Subproceso
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
Plataformas 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