.thread(设置寄存器上下文)
.thread 命令指定将用于寄存器上下文的线程。
.thread [/p [/r] ] [/P] [/w] [Thread]
参数
/p
(仅限实时调试)如果包含此选项并且 Thread 为非零,则会在访问之前自动将拥有此线程的进程的所有转换页表条目 (PTE) 转换为物理地址。 这可能会导致速度变慢,因为调试器必须查找此进程使用的所有内存的物理地址,并且可能需要通过调试电缆传输大量数据。 (此行为与 .cache forcedecodeuser 的行为相同。)
如果包含 /p 选项并且 Thread 为零或被省略,则将禁用此转换。 (此行为与 .cache noforcedecodeuser 的行为相同。)
/r
(仅限实时调试)如果包含 /r 选项以及 /p 选项,则在设置进程和寄存器上下文后,将重新加载拥有此线程的进程的用户模式符号。 (此行为与 .reload /user 的行为相同。)
/P
(仅限实时调试)如果包含此选项并且 Thread 为非零,则会在访问之前自动将所有转换页表条目 (PTE) 转换为物理地址。 与 /p 选项不同,这将转换所有用户模式和内核模式进程的 PTE,而不仅仅是拥有此线程的进程。 这可能会导致速度变慢,因为调试器必须查找使用的所有内存的物理地址,并且可能需要通过调试电缆传输大量数据。 (此行为与 .cache forcedecodeptes 的行为相同。)
/w
(仅限 64 位内核调试)将线程的活动上下文更改为 WOW64 32 位上下文。 指定的线程必须在具有 WOW64 状态的进程中运行。
线
线程的地址。 如果这被省略或为零,则会将线程上下文重置为当前线程。
环境
项 | 说明 |
---|---|
模式 | 仅内核模式 |
目标 | 实时、崩溃转储 |
平台 | 全部 |
其他信息
有关寄存器上下文和其他上下文设置的详细信息,请参阅更改上下文。
注解
通常,在进行内核调试时,唯一可见的寄存器是与当前线程关联的寄存器。
.thread 命令指示内核调试器将指定的线程用作寄存器上下文。 执行此命令后,调试器将有权访问此线程最重要的寄存器和堆栈跟踪。 此寄存器上下文将一直存在,直到允许目标执行或使用另一个寄存器上下文命令(.thread、.cxr 或 .trap)。 请参阅注册上下文了解完整详细信息。
在处于 WOW64 状态的进程上运行的线程上,只能在 64 位内核调试会话中使用 /w 选项。 检索的上下文将是 WOW64 记住的最后一个上下文;这通常是 Thread 执行的最后一个用户模式代码。 仅当目标处于本机计算机模式时,才能使用此选项。 例如,如果目标在使用 WOW64 模拟基于 x86 的处理器的 64 位计算机上运行,则无法使用此选项。 使用 /w 选项会导致计算机模式自动切换到基于 x86 的处理器。
此命令不会实际更改当前线程。 换句话说,如果没有使用任何参数,则 !thread 和 !teb 等扩展仍将默认为当前线程。
以下是一个示例。 使用 !process 扩展查找所需线程的地址。 (在这种情况下,!process 0 0 用于列出所有进程,然后再次使用 !process 列出所需进程的所有线程。
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
.....
现在,将 .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