Partager via


.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