.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