Debugging Tools for Windows

.thread (Set Register Context)

.thread 命令指定哪个线程用作寄存器上下文。

语法

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

参数

/p
(仅活动调试) 如果使用了该选项并且Thread 非0, 拥有该线程的进程的所有过渡页表项(transition page table entries)在访问前都会被转换成物理地址。这可能造成运行变慢,因为调试器会查找该进程使用的所有内存的物理地址,并且需要从调试电缆传输大量数据。 (该行为和.cache forcedecodeuser一样。)

如果包含/p 选项并且Thread 为0或省略,则禁止这种转换。 (这种行为和.cache noforcedecodeuser一样)

/r
(仅活动调试) 如果/r/p 一起使用,则进程和寄存器上下文设置之后会重新加载拥有该线程的进程的用户模式符号。 (该行为和reload /user一样)
/P
 (仅活动调试) 如果包含该选项并且Thread非0,所有过渡页表项在访问前都会转换成物理地址。和/p 不同,这种PTE的转换会针对所有用户模式和内核模式进程,而不仅仅是拥有该线程的进程。这可能造成运行变慢,因为调试器会查找该进程使用的所有内存的物理地址,并且需要从调试电缆传输大量数据。 (该行为和.cache forcedecodeptes一样。)
/w
(仅64位内核调试) 将线程的活动上下文改变成WOW64 32位上下文。指定的线程必须运行在一个WOW64状态的进程中。
Thread
线程的地址。如果省略或为0,线程上下文被重置为当前线程。

环境

模式 仅内核模式
目标 活动目标、崩溃转储
平台 所有

注释

一般来说,内核调试时只有当前线程关联的寄存器才是可见的。

.thread 命令指示内核调试其使用指定线程作为寄存器上下文。命令执行后,调试器就可以访问该线程的重要寄存器和堆栈回溯了。该寄存器上下文会一直持续到允许目标执行或者使用另一个寄存器上下文命令(.thread.cxr.trap)为止。查看寄存器上下文获得详细信息。

/w 选项只能在64位内核调试会话中调试WOW64 状态的进程中的线程时可以使用。获得的上下文是WOW64最近一次记录的上下文,这通常是Thread最后执行的用户模式代码。该选项只有当目标在原生机器模式(native machine mode)时才可用。例如,如果目标运行在通过WOW64模拟x86处理器的机器上,该选项就不能使用。使用/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

附加信息

关于寄存器上下文和其他上下文设置的更多信息,查看改变上下文

Build machine: CAPEBUILD