Debugging Tools for Windows

!thread

!thread扩展显示目标系统中线程包括ETHREAD块在内的摘要信息。该命令只能在内核模式调试下使用。

这个扩展命令和.thread (Set Register Context)命令不同。

语法

Windows 2000的语法:

!thread [Address [Flags]] 

Windows XP的语法:

!thread [-p] [-t] [Address [Flags]] 

参数

-p
显示拥有该线程的进程的摘要信息。
-t
包含这个选项时,Address是线程ID,而不是线程地址。
Address
指定目标机上线程的16进制地址。如果Address为-1或省略,则表示当前线程。
Flags
指定显示的详细级别。Flags可以是下面这些位的任意组合。如果Flags为0,只会显示最少量的信息。默认为0x6: 
Bit 1 (0x2)
显示线程的等待状态。
Bit 2 (0x4)
如果不和Bit 1(0x2)一起使用则不会起作用。如果和Bit 1一起使用,线程会和调用堆栈一起显示出来。
Bit 3 (0x8)
(Windows XP和之后)  

在每个函数的显示信息中加入返回地址、堆栈指针、以及bsp寄存器的值(在Itanium系统中),但是不显示函数的参数。

Bit 4 (0x10)
(Windows XP和之后) 在这个命令持续期间,将进程上下文设置为拥有指定线程的那个进程。这回使得线程调用堆栈的显示更加精确。

DLL

Windows 2000 Kdextx86.dll
Windows XP和之后 Kdexts.dll

注释

下面是Windows 2000系统上的示例:

kd> !thread ff8632c0
THREAD ff8632c0  Cid 38c.380  Teb: 7ffde000  Win32Thread: e1bc1a08 WAIT: (WrUserRequest) UserMode Non-Alertable
    ff8543e0  SynchronizationEvent
Not impersonating
Owning Process ff89c7a0
WaitTime (seconds)      16923
Context Switch Count    67                   LargeStack
UserTime                  0:00:00.0000
KernelTime                0:00:00.0093
Start Address 0x77e878c1
Win32 Start Address 0x01003dd0
Stack Init fd536000 Current fd535c20 Base fd536000 Limit fd531000 Call 0
Priority 12 BasePriority 8 PriorityDecrement 0 DecrementCount 0

ChildEBP RetAddr  Args to Child
fd535c38 8012d61c 00000000 e1bc1a08 00000001 ntoskrnl!KiSwapThread+0xc5
fd535cbc 801672a2 00000001 00000001 000021bf ntoskrnl!KeWaitForSingleObject+0x1a1
fd535d4c 80161691 0006ff08 00000000 00000000 ntoskrnl!ExFreePool+0xb
fd535d4c a01772a8 0006ff08 00000000 00000000 ntoskrnl!KiSystemService+0xc4
ffffffff 00000000 00000000 00000000 00000000 +0xa01772a8

!thread输出中的重要信息在下表中描述。

参数 含义
Thread address 单词THREAD后面的16进制数字是ETHREAD 块的地址。前面例子中,线程地址为0xFF8632C0。
Thread ID Cid后面的两个16进制数字是进程ID和线程ID:进程ID.线程ID。前面例子中,进程ID为0x38C,或者10进制的908,线程ID为0x380,10进制是896。
Thread Environment Block (TEB) Teb后面的16进制数字是线程环境块(TEB)的地址。前面例子中的TEB地址为0x7FFDE000。
System Service Dispatch Table Win32Thread后面的16进制地址是系统服务分配表(system service dispatch table)的地址。前面例子中位于0xE1BC1A08。
Thread State 线程状态显示在以WAIT开头的行的末尾。前面例子中线程是在non-alertable 状态下。
Owning Process Owning Process后的16进制地址是拥有该线程的进程的EPROCESS地址。
Start Address Start Address后的16进制数字是线程的起始地址。可能是以符号化的形式显示的。
User Thread Function Win32 Start Addres后面的16进制数字是用户的线程函数的地址。
Priority Priority后面是线程的优先级信息。
Stack trace 输出的末尾是线程的调用堆栈。

附加信息

关于内核模式下线程的信息,查看改变上下文。关于分析进程和线程的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

Build machine: CAPEBUILD