.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