Debugging Tools for Windows |
!stacks扩展显示内核调用堆栈的信息。
Windows 2000的语法:
Windows XP和之后的语法:
0 | 显示当前内核调用堆栈的摘要。这是默认值。 |
1 | 显示当前页换出的堆栈,以及当前内核栈。 |
2 | 显示所有调用堆栈的完整参数,以及当前页换出的堆栈和当前内核堆栈。 |
Windows 2000 | Kdextx86.dll |
Windows XP和之后 | Kdexts.dll |
!stacks扩展给出每个线程状态的简单摘要。可以用它来代替!process扩展命令对系统进行快速查看,特别是在类似资源争用或者死锁这样的多线程问题时。
!findstack用户模式扩展命令也可以显示特定调用堆栈的信息。
下面是一个最简单的!stacks命令示例:
Proc.Thread .Thread ThreadState Blocker
[System]
4.000050 827eea10 Blocked +0xfe0343a5
[smss.exe]
[csrss.exe]
b0.0000a8 82723b70 Blocked ntoskrnl!_KiSystemService+0xc4
b0.0000c8 82719620 Blocked ntoskrnl!_KiSystemService+0xc4
b0.0000d0 827d5d50 Blocked ntoskrnl!_KiSystemService+0xc4
.....
第一列是进程ID和线程ID(用点号隔开)。
第二列是线程的ETHREAD块的当前地址。
第三列是线程的状态(initialized, ready, running, standby, terminated, transition, 或blocked)。
第四列显示的是线程调用堆栈顶部的地址。
下面是更详细一些的!stacks输出:
Proc.Thread .Thread ThreadState Blocker
[System]
4.000008 827d0030 Blocked ntoskrnl!MmZeroPageThread+0x66
4.000010 827d0430 Blocked ntoskrnl!ExpWorkerThread+0x189
4.000014 827cf030 Blocked Stack paged out
4.000018 827cfda0 Blocked Stack paged out
4.00001c 827cfb10 Blocked ntoskrnl!ExpWorkerThread+0x189
.....
[smss.exe]
9c.000098 82738310 Blocked Stack paged out
9c.0000a0 826a5190 Blocked Stack paged out
9c.0000a4 82739d30 Blocked Stack paged out
[csrss.exe]
b0.0000bc 826d0030 Blocked Stack paged out
b0.0000b4 826c9030 Blocked Stack paged out
b0.0000a8 82723b70 Blocked ntoskrnl!_KiSystemService+0xc4
.....
kd> !stacks 2
Proc.Thread .Thread ThreadState Blocker
[System]
4.000008 827d0030 Blocked ntoskrnl!KiSwapThread+0xc5
ntoskrnl!KeWaitForMultipleObjects+0x2b4
ntoskrnl!MmZeroPageThread+0x66
ntoskrnl!Phase1Initialization+0xd82
ntoskrnl!PspSystemThreadStartup+0x4d
ntoskrnl!CreateSystemRootLink+0x3d8
+0x3f3f3f3f
4.000010 827d0430 Blocked ntoskrnl!KiSwapThread+0xc5
ntoskrnl!KeRemoveQueue+0x191
.....
关于内核栈的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。