Compartilhar via


.thread (Definir contexto de registro)

O comando .thread especifica qual thread será utilizado para o contexto de registro.

.thread [/p [/r] ] [/P] [/w] [Thread]

Parâmetros

/p
(Somente depuração ao vivo) Se essa opção for incluída e Thread for diferente de zero, todas as entradas de tabela de página de transição (PTEs) para o processo que tem esse thread serão convertidas automaticamente em endereços físicos antes do acesso. Isso pode causar lentidão, porque o depurador terá que buscar os endereços físicos para toda a memória usada por esse processo, e uma quantidade significativa de dados pode precisar ser transferida pelo cabo de depuração. (Este comportamento é o mesmo do .cache forcedecodeuser.)

Se a opção /p for incluída e Thread for zero ou omitido, essa conversão será desabilitada. (Este comportamento é o mesmo do .cache noforcedecodeuser.)

/r
(Somente depuração ao vivo) Se a opção /r for incluída junto com a opção /p, os símbolos de modo de usuário para o processo que possui esse thread serão recarregados depois que os contextos de processo e registro tiverem sido definidos. (Este comportamento é o mesmo do .reload /user.)

/P
(Somente depuração ao vivo) Se essa opção for incluída e Thread for diferente de zero, todas as entradas de tabela de página de transição (PTEs) serão convertidas automaticamente em endereços físicos antes do acesso. Ao contrário da opção /p, isso converte os PTEs para todos os processos de modo de usuário e modo kernel, não somente o processo que possui esse thread. Isso pode causar lentidão, porque o depurador terá que buscar os endereços físicos para toda a memória em uso, e uma quantidade enorme de dados pode precisar ser transferida pelo cabo de depuração. (Este comportamento é o mesmo do .cache forcedecodeptes.)

/w
(Somente depuração de kernel de 64 bits) Altera o contexto ativo do thread para o contexto de 32 bits do WOW64. O thread especificado deve estar em execução em um processo que tenha um estado WOW64.

Fio
O endereço do thread. Se isso for omitido ou zero, o contexto do thread será redefinido ao thread atual.

Ambiente

Item Descrição
Modos somente no modo kernel
Destinos ao vivo, despejo de memória
Plataformas all

Informações Adicionais

Para mais informações sobre o contexto de registro e outras configurações de contexto, consulte Como alterar contextos.

Comentários

Geralmente, quando você está fazendo depuração kernel, os únicos registros visíveis são aqueles associados ao thread atual.

O comando .thread instrui o depurador do kernel a usar o thread especificado como o contexto de registro. Depois que este comando for executado, o depurador terá acesso aos registradores mais importantes e ao rastreamento de pilha para este thread. Esse contexto de registro persiste até que você permita que o destino execute ou use outro comando de contexto de registro (.thread, .cxr ou .trap). Consulte Registrar contexto para saber os detalhes completos.

A opção /w só pode ser usada em sessões de depuração de kernel de 64 bits em um thread em execução em um processo que tenha um estado WOW64. O contexto recuperado será o último contexto lembrado pelo WOW64; este geralmente é o último código de modo de usuário executado pelo Thread. Essa opção pode ser usada somente se o destino estiver no modo de máquina nativa. Por exemplo, se o destino estiver sendo executado em uma máquina de 64 bits que esteja emulando um processador com base em x86 usando WOW64, essa opção não poderá ser usada. O uso da opção /w fará com que o modo de máquina alterne automaticamente para um processador com base em x86.

Na verdade, esse comando não muda o thread atual. Em outras palavras, extensões como !thread e !teb ainda terão como padrão o thread atual se for usado nenhum argumento com eles.

Veja um exemplo. Use a extensão !process para localizar o endereço do thread desejado. (Nesse caso, !process 0 0 é usado para listar todos os processos. Depois, !process é usado uma segunda vez para listar todos os threads para o processo desejado.)

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

.....

Agora use o comando .thread com o endereço do thread desejado. Isso define o contexto do registro e lhe permite examinar os registradores importantes e a pilha de chamadas para esse thread.

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