Debugging Tools for Windows |
!thread扩展显示目标系统中线程包括ETHREAD块在内的摘要信息。该命令只能在内核模式调试下使用。
这个扩展命令和.thread (Set Register Context)命令不同。
Windows 2000的语法:
Windows XP的语法:
在每个函数的显示信息中加入返回地址、堆栈指针、以及bsp寄存器的值(在Itanium系统中),但是不显示函数的参数。
Windows 2000 | Kdextx86.dll |
Windows XP和之后 | Kdexts.dll |
下面是Windows 2000系统上的示例:
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。