Freigeben über


.thread (Set Register Context)

Der Befehl .thread gibt an, welcher Thread für den Registerkontext verwendet werden soll.

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

Parameter

/p
(Nur Live-Debugging) Wenn diese Option enthalten ist und Thread ungleich Null ist, werden alle Übergangsseitentabelleneinträge (PTEs) für den Prozess, dem dieser Thread gehört, vor dem Zugriff automatisch in physikalische Adressen übersetzt. Dies kann zu einer Verlangsamung führen, da der Debugger die physikalischen Adressen für den gesamten von diesem Prozess verwendeten Speicher suchen muss und möglicherweise eine erhebliche Datenmenge über das Debug-Kabel übertragen werden muss. (Dieses Verhalten entspricht dem von .cache forcedecodeuser.)

Wenn die Option /p enthalten ist und Thread Null ist oder weggelassen wird, wird diese Übersetzung deaktiviert. (Dieses Verhalten entspricht dem von .cache noforcedecodeuser.)

/r
(Nur Live-Debugging) Wenn die Option /r zusammen mit der Option /p verwendet wird, werden die Benutzermodus-Symbole für den Prozess, der diesen Thread besitzt, neu geladen, nachdem der Prozess- und Registerkontext gesetzt wurde. (Dieses Verhalten ist dasselbe wie das von .reload /user.)

/P
(Nur Live-Debugging) Wenn diese Option enthalten ist und Thread ungleich Null ist, werden alle Übergangsseitentabelleneinträge (PTEs) vor dem Zugriff automatisch in physikalische Adressen übersetzt. Im Gegensatz zur Option /p werden hier die PTEs für alle Prozesse im Benutzermodus und im Kernelmodus übersetzt, nicht nur für den Prozess, dem dieser Thread gehört. Dies kann zu Verlangsamungen führen, da der Debugger die physikalischen Adressen für den gesamten verwendeten Speicher suchen muss und eine große Menge an Daten über das Debug-Kabel übertragen werden muss. (Dieses Verhalten entspricht dem von .cache forcedecodeptes.)

/w
(Nur 64-Bit-Kernel-Debugging) Ändert den aktiven Kontext für den Thread in den WOW64-32-Bit-Kontext. Der angegebene Thread muss in einem Prozess laufen, der einen WOW64-Status hat.

Faden
Die Adresse des Threads. Wenn dieser Wert weggelassen wird oder Null ist, wird der Thread-Kontext auf den aktuellen Thread zurückgesetzt.

Environment

Element Beschreibung
Modi Nur Kernelmodus
Ziele live, Crash Dump
Plattformen Alle

Zusätzliche Informationen

Weitere Informationen über den Registerkontext und andere Kontexteinstellungen finden Sie unter Changing Contexts.

Hinweise

Im Allgemeinen sind beim Kernel-Debugging nur die Register sichtbar, die mit dem aktuellen Thread verbunden sind.

Der Befehl .thread weist den Kernel-Debugger an, den angegebenen Thread als Registerkontext zu verwenden. Nach der Ausführung dieses Befehls hat der Debugger Zugriff auf die wichtigsten Register und den Stack-Trace für diesen Thread. Dieser Registerkontext bleibt bestehen, bis Sie dem Ziel die Ausführung gestatten oder einen anderen Registerkontextbefehl verwenden (.thread, .cxr oder .trap). Siehe Register Context für weitere Informationen.

Die Option /w kann nur in 64-Bit-Kernel-Debugging-Sitzungen auf einem Thread verwendet werden, der in einem Prozess läuft, der den Status WOW64 hat. Der abgefragte Kontext ist der letzte von WOW64 gespeicherte Kontext; dies ist in der Regel der letzte im Benutzermodus ausgeführte Code von Thread. Diese Option kann nur verwendet werden, wenn sich das Ziel im nativen Maschinenmodus befindet. Wenn das Ziel beispielsweise auf einem 64-Bit-Rechner läuft, der einen x86-basierten Prozessor mit WOW64 emuliert, kann diese Option nicht verwendet werden. Mit der Option /w wird der Maschinenmodus automatisch auf einen x86-basierten Prozessor umgestellt.

Mit diesem Befehl wird der aktuelle Thread nicht wirklich geändert. Mit anderen Worten, Erweiterungen wie !thread und !teb werden weiterhin auf den aktuellen Thread eingestellt, wenn keine Argumente mit ihnen verwendet werden.

Beispiel: Verwenden Sie die Erweiterung !process, um die Adresse des gewünschten Threads zu finden. (In diesem Fall wird !process 0 0 verwendet, um alle Prozesse aufzulisten, dann wird !process ein zweites Mal verwendet, um alle Threads für den gewünschten Prozess aufzulisten.)

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

.....

Verwenden Sie nun den Befehl .thread mit der Adresse des gewünschten Threads. Dies setzt den Registerkontext und ermöglicht es Ihnen, die wichtigen Register und den Aufrufstapel für diesen Thread zu untersuchen.

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