Bug 检查 0xA:IRQL_NOT_LESS_OR_EQUAL

IRQL_NOT_LESS_OR_EQUAL Bug 检查的值为 0x0000000A。 此 Bug 检查表明在提高中断请求级别 (IRQL) 时,Microsoft Windows 或内核模式驱动程序访问了无效地址的分页内存。 原因通常是指针错误或分页性问题。

重要

这篇文章适合程序员阅读。 如果您是在使用计算机时收到蓝屏错误代码的客户,请参阅蓝屏错误疑难解答

IRQL_NOT_LESS_OR_EQUAL 参数

参数 说明
1 无法访问的虚拟内存地址。

使用此地址上的 !pool 查看它是否为分页池。 在收集有关失败的信息时,可能有用的其他命令是 !pte!addressln (列出最近符号)。
2 失败时的 IRQL。


2 - 发生故障时,IRQL 为 DISPATCH_LEVEL。
3 描述导致错误的操作的位域。 请注意,位 3 仅在支持此报告级别的芯片集上可用。

位 0 值
0 - 读取操作
1 - 写入操作

位 3 值
0 - 非执行操作
1 - 执行操作

位 0 和位 3 组合值
0x0 - 尝试从参数 1 中的地址读取时出错
0x1 - 尝试写入参数 1 中的地址时出错
0x8 - 尝试从参数 1 中的地址执行代码时出错

此值源于:
  • 调用在 DISPATCH_LEVEL 时无法在 DISPATCH_LEVEL 调用的函数。
  • 忘记释放自旋锁。
  • 在代码必须为不可分页时将其标记为可分页。 例如,如果代码获取了自旋锁,或在延迟过程调用中被调用。
4 发生故障时的指令指针。

使用此地址上的 ln(列出最近符号) 命令查看函数名称。

原因

此 Bug 检查是由于使用不当地址的内核模式设备驱动程序引起的。

此 Bug 检查表示在中断请求级别 (IRQL) 升高时尝试访问无效地址。 原因是内存指针错误或设备驱动程序代码的分页性问题。

可用于对导致 Bug 检查的编码错误类型进行分类的一般准则如下所示:

  • 如果参数 1 小于0x1000,则问题可能是 NULL 指针的取消引用。

  • 如果 !pool 报告参数 1 是分页池(或其他类型的可分页内存),则 IRQL 太高,无法访问此数据。 在较低的 IRQL 上运行,或分配非分页池中的数据。

  • 如果参数 3 表明 Bug 检查试图执行可分页代码,则 IRQL 太高,无法调用此函数。 在较低的 IRQL 上运行,或者不将代码标记为可分页。

  • 这可能是由于释放后使用或位翻转而导致的指针错误。 使用 !pte!addressln(列出最近符号)调查参数 1 的有效性。

解决方法

如果内核调试器可用,请获取堆栈跟踪。 首先运行 !analyze 调试器扩展以显示有关 Bug 检查的信息。 !analyze 扩展有助于确定根本原因。 接下来,输入其中一个 k* (显示堆栈回溯) 命令以查看调用堆栈。

收集信息

检查驱动程序的名称是否列在蓝屏上。

在事件查看器中检查系统日志以获取其他错误消息,这可能有助于发现导致错误的设备或驱动程序。 在系统日志中查找与蓝屏同时出现的严重错误。

驱动程序验证程序

驱动程序验证程序是一个实时运行的工具,用于检查驱动程序的行为。 例如,驱动程序验证程序检查内存资源(如内存池)的使用。 如果在执行驱动程序代码时标识错误,它会主动创建一个异常,以允许进一步检查该部分驱动程序代码。 驱动程序验证程序管理器内置于 Windows 中,可在所有 Windows 电脑上使用。

若要启动驱动程序验证程序管理器,请在命令提示符下键入 verifier。 你可以配置要验证的驱动程序。 验证驱动程序的代码在运行时会增加开销,因此请尝试验证尽可能少的驱动程序。 有关详细信息,请参阅驱动程序验证程序

下方代码显示了一个调试示例:

kd> .bugcheck       [Lists bug check data.]
Bugcheck code 0000000a
Arguments 00000000 0000001c 00000000 00000000

kd> kb [Lists the stack trace.]
ChildEBP RetAddr  Args to Child
8013ed5c 801263ba 00000000 00000000 e12ab000 NT!_DbgBreakPoint
8013eecc 801389ee 0000000a 00000000 0000001c NT!_KeBugCheckEx+0x194
8013eecc 00000000 0000000a 00000000 0000001c NT!_KiTrap0E+0x256
8013ed5c 801263ba 00000000 00000000 e12ab000
8013ef64 00000246 fe551aa1 ff690268 00000002 NT!_KeBugCheckEx+0x194

kd> kv [Lists the trap frames.]
ChildEBP RetAddr  Args to Child
8013ed5c 801263ba 00000000 00000000 e12ab000 NT!_DbgBreakPoint (FPO: [0,0,0])
8013eecc 801389ee 0000000a 00000000 0000001c NT!_KeBugCheckEx+0x194
8013eecc 00000000 0000000a 00000000 0000001c NT!_KiTrap0E+0x256 (FPO: [0,0] TrapFrame @ 8013eee8)
8013ed5c 801263ba 00000000 00000000 e12ab000
8013ef64 00000246 fe551aa1 ff690268 00000002 NT!_KeBugCheckEx+0x194

kd> .trap 8013eee8 [Gets the registers for the trap frame at the time of the fault.]
eax=dec80201 ebx=ffdff420 ecx=8013c71c edx=000003f8 esi=00000000 edi=87038e10
eip=00000000 esp=8013ef5c ebp=8013ef64 iopl=0         nv up ei pl nz na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010202
ErrCode = 00000000
00000000 ???????????????    [The current instruction pointer is NULL.]

kd> kb       [Gives the stack trace before the fault.]
ChildEBP RetAddr  Args to Child
8013ef68 fe551aa1 ff690268 00000002 fe5620d2 NT!_DbgBreakPoint
8013ef74 fe5620d2 fe5620da ff690268 80404690
NDIS!_EthFilterIndicateReceiveComplete+0x31
8013ef64 00000246 fe551aa1 ff690268 00000002 elnkii!_ElnkiiRcvInterruptDpc+0x1d0

注解

在安装有故障的设备驱动程序、系统服务或 BIOS 后,通常会出现产生此 Bug 检查的错误。

如果在升级到较新版本的 Windows 时遇到 Bug 检查 0xA,该错误可能是由与新版本不兼容的设备驱动程序、系统服务、病毒扫描程序或备份工具引起的。

解决硬件故障问题:如果系统中最近添加了新硬件,请将其删除并查看错误是否再次出现。 如果现有硬件出现故障,请卸下或更换故障部件。 运行系统制造商提供的硬件诊断程序。 有关这些过程的详细信息,请参阅计算机的用户手册。

解决故障系统服务问题:禁用服务并确认该措施否可以解决错误。 如果可以,请联系系统服务的制造商以了解可能的更新。 如果在系统启动期间发生错误,请调查 Windows 修复选项。 有关详细信息,请参阅 Windows 10 中的恢复选项

解决防病毒软件问题:禁用程序并确认该措施是否可以解决错误。 如果是,请与程序制造商联系,了解可能的更新。

有关对 Bug 检查进行故障排除的一般信息,请参阅蓝屏数据

另请参阅

Bug 检查代码参考