Debugging Tools for Windows

!exqueue

!exqueue扩展显示ExWorkerQueue工作队列(work queue)中当前被排队的项目列表。

语法

!exqueue [Flags

参数

Flags
可以是下面这些值的任意组合。默认值为0x0,只显示很有限的信息。
Bit 0 (0x1) 如果没有设置0x02的话,显示时间和优先级统计。
Bit 1 (0x2) 显示工作队列关联的线程和事件列表,以及它们的等待状态。
Bit 2 (0x4) 显示和工作队列关联的线程列表。如果没有同时使用0x2,则每个线程显示在单独的一行上。如果使用了0x2,每个线程和一个堆栈回溯一起显示。
Bit 3 (0x8) (Windows XP和之后) 在队列的每个线程的显示中加入返回地址、堆栈指针、以及(在Itanium系统中)bsp寄存器的值。不会显示函数的参数。
Bit 4 (0x10) 只显示临界工作队列(critical work queue)。
Bit 5 (0x20) 只显示延迟工作队列(delayed work queue)。
Bit 6 (0x40) 只显示超临界工作队列(hypercritical work queue)。

DLL

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

注释

如果Flags不包含bit 4、5、6,则显示中包括临界工作队列 (critical work queue)、延时工作队列(delayed work queue),以及超临界工作队列(hypercritical work queue)。

下面是该命令输出的示例:

kd> !exqueue
Dumping ExWorkerQueue: 8046A5C0

**** Critical WorkQueue( current = 0 maximum = 1 )
THREAD fe502940  Cid 8.c  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe5026c0  Cid 8.10  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe502440  Cid 8.14  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe5021c0  Cid 8.18  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe501020  Cid 8.1c  Teb: 00000000  Win32Thread: 00000000 WAIT

**** Delayed WorkQueue( current = 0 maximum = 1 )
THREAD fe501da0  Cid 8.20  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe501b20  Cid 8.24  Teb: 00000000  Win32Thread: 00000000 WAIT
THREAD fe5018a0  Cid 8.28  Teb: 00000000  Win32Thread: 00000000 WAIT

**** HyperCritical WorkQueue( current = 0 maximum = 1 )
THREAD fe501620  Cid 8.2c  Teb: 00000000  Win32Thread: 00000000 WAIT

!exqueue输出中的重要信息有:

参数 含义
current 队列中的运行中线程的数量;即队列中非等待状态的线程数量。
maximum 队列中任何给定时间点允许运行的线程数量。这个一般是由系统中处理器数量决定的。

系统会执行任何current值比maximum值小的队列中的work item。如果current大于或等于maximum,则在有更多的队列中的线程完成执行或者进入等待状态之前,不会有新的work item被执行。该规则当某个CPU密集型work item正在执行并且不会进入等待状态时会延迟系统,因为它会阻止新的work item被执行,即使队列中还有空闲线程。

附加信息

关于工作者线程的更多信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

Build machine: CAPEBUILD