.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