Debugging Tools for Windows

!irql

!irql扩展显示目标机在调试器中断之前某个处理器的中断请求级别(interrupt request level (IRQL))。

语法

!irql [Processor

参数

Processor
指定处理器。输入处理器号。如果省略该参数,调试器显示当前处理器的IRQL。

DLL

!irql扩展仅在Windows Server 2003和之后的Windows版本中可用。

Windows 2000 不可用
Windows XP 不可用
Windows Server 2003和之后 Kdexts.dll

注释

当目标机中断到调试器时IRQL会改变,但是调试器中断之前的IRQL会被保存下来。!irql扩展会显示这个被保存的 IRQL。

类似的,当发生bug check并且创建dump文件时,dump文件中会保存bug check之前的IRQL,而不是KeBugCheckEx例程执行时的。

两种情况下,除了x86架构上之外,当前IRQL都会被提升到DISPATCH_LEVEL。因此,如果不止一个这样的事件发生,那么显示出来的IRQL会是DISPATCH_LEVEL,这样对调试问题就没有用处了。

!pcr扩展命令可以在所有Windows版本上显示当前IRQL,但是当前IRQL一般都是无用的。Bug check或者调试器连接之前的IRQL要更加有用一点,而它只能用!irql显示出来。

如果指定了非法的处理器号,或者内核被破坏了,调试器会显示"Cannot get PRCB address"的信息。

下面是该扩展在一个双处理器的x86计算机上的输出示例:

kd> !irql 0
Debugger saved IRQL for processor 0x0 -- 28 (CLOCK2_LEVEL)

kd> !irql 1
Debugger saved IRQL for processor 0x1 -- 0 (LOW_LEVEL)

如果调试器在详细模式(verbose mode)下,则还会显示IRQL本身的说明。下面是一个在Itanium处理器上的示例 :

kd> !irql
Debugger saved IRQL for processor 0x0 -- 12 (PC_LEVEL) [Performance counter level]

IRQL数字的意义通常由处理器决定。这里是一个x64 处理器的例子。注意IRQL数字和上面的例子一样,但是该IRQL的含义是不同的:

kd> !irql
Debugger saved IRQL for processor 0x0 -- 12 (SYNCH_LEVEL) [Synchronization level]

附加信息

关于IRQL的信息,查看Windows Driver Kit (WDK)文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

Build machine: CAPEBUILD