.thread (Définir le contexte de registre)
La commande .thread spécifie le thread qui sera utilisé pour le contexte de registre.
.thread [/p [/r] ] [/P] [/w] [Thread]
Paramètres
/p
(Débogage dynamique uniquement) Si cette option est incluse et que Thread a une valeur différente de zéro, toutes les entrées de table des pages (PTE) de transition pour le processus propriétaire de ce thread sont automatiquement traduites en adresses physiques avant accès. Cela pourrait entraîner des ralentissements, car le débogueur devra rechercher les adresses physiques de toute la mémoire utilisée par ce processus. Une quantité importante de données peut être transférée sur le câble de débogage. (Ce comportement est identique à celui de .cache forcedecodeuser.)
Si l’option /p est incluse et que Thread est nul ou omis, cette traduction est désactivée. (Ce comportement est identique à celui de .cache noforcedecodeuser.)
/r
(Débogage dynamique uniquement) Si l’option /r est incluse avec l’option /p, les symboles en mode utilisateur pour le processus propriétaire de ce thread sont rechargés une fois que le processus et les contextes de registre ont été définis. (Ce comportement est identique à celui de .reload /user.)
/P
(Débogage dynamique uniquement) Si cette option est incluse et que Thread a une valeur différente de zéro, toutes les entrées de table des pages (PTE) de transition sont automatiquement traduites en adresses physiques avant accès. Contrairement à l’option /p, celle-ci traduit les PTE pour tous les processus en mode utilisateur et en mode noyau, et pas seulement le processus propriétaire de ce thread. Cela pourrait causer des ralentissements, car le débogueur devra rechercher les adresses physiques de toutes les mémoires utilisées par ce processus, et une quantité très importante de données peut être transférée sur le câble de débogage. (Ce comportement est identique à celui de .cache forcedecodeptes.)
/w
(débogage du noyau 64 bits uniquement) Remplace le contexte actif du thread par le contexte WOW64 32 bits. Le thread spécifié doit être en cours d’exécution dans un processus à l'état WOW64.
Fil
L’adresse du thread. Si elle est omise ou que sa valeur est zéro, le contexte de thread est réinitialisé au thread actuel.
Environnement
Élément | Description |
---|---|
Modes | mode noyau uniquement |
Targets | live, vidage de la mémoire |
Platforms | all |
Informations supplémentaires
Pour plus d’informations sur le contexte de registre et sur d'autres paramètres de contexte, consultez Modification des contextes.
Notes
En règle générale, lorsque vous effectuez le débogage du noyau, les seuls registres visibles sont ceux associés au thread actuel.
La commande .thread indique au débogueur du noyau d’utiliser le thread spécifié comme contexte de registre. Une fois cette commande exécutée, le débogueur aura accès aux registres les plus importants et à la trace de pile pour ce thread. Ce contexte de registre persiste jusqu'à ce que vous autorisiez la cible à s'exécuter ou que vous utilisiez une autre commande de contexte de registre (.thread, .cxr ou .trap). Pour plus d’informations, consultez Contexte de registre.
L’option /w ne peut être utilisée que dans les sessions de débogage du noyau 64 bits sur un thread s’exécutant dans un processus à l'état WOW64. Le contexte récupéré sera le dernier contexte mémorisé par WOW64 ; il s’agit généralement du dernier code exécuté en mode utilisateur par Thread. Cette option ne peut être utilisée que si la cible est en mode ordinateur natif. Par exemple, si la cible s’exécute sur un ordinateur 64 bits qui émule un processeur x86 à l’aide de WOW64, cette option ne peut pas être utilisée. L’utilisation de l’option /w entraîne le passage automatique du mode ordinateur à un processeur x86.
Cette commande ne modifie pas réellement le thread actuel. En d’autres termes, les extensions telles que !thread et !teb seront toujours par défaut sur le thread actuel si aucun argument n’est utilisé avec elles.
Voici un exemple. Utilisez l’extension !process pour rechercher l’adresse du thread souhaité. (Dans ce cas, !process 0 0 est utilisé pour répertorier tous les processus, puis !process est utilisé une deuxième fois pour répertorier tous les threads du processus souhaité.)
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
.....
Utilisez maintenant la commande .thread avec l’adresse du thread souhaité. Cela définit le contexte de registre et vous permet d’examiner les registres importants et la pile des appels pour ce 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