错误检查 0x1E:KMODE_EXCEPTION_NOT_HANDLED

KMODE_EXCEPTION_NOT_HANDLED 错误检查的值为 0x0000001E。 错误检查表明内核模式应用程序产生了错误处理程序未捕获到的异常。

重要

这篇文章适合程序员阅读。 如果你是 Microsoft 客户,并且你的计算机显示蓝屏错误代码,请参阅对蓝屏错误进行故障排除

KMODE_EXCEPTION_NOT_HANDLED 参数

参数 说明
1 未处理的异常代码。
2 发生异常的地址。
3 异常记录的异常信息参数 0。
4 异常记录的异常信息参数 0。

原因

若要对此错误检查进行解释,必须确定生成的具体异常。

常见的异常代码包括:

  • 0x80000002: STATUS_DATATYPE_MISALIGNMENT

    遇到未对齐的数据引用。

  • 0x80000003: STATUS_BREAKPOINT

    没有内核调试器连接到系统时,遇到断点或 ASSERT。

  • 0xC0000005: STATUS_ACCESS_VIOLATION

    出现内存访问冲突。 (Bug 检查的参数 4 是驱动程序尝试访问的地址。)

有关异常代码的完整列表,请参阅 NTSTATUS 值。 异常代码在 ntstatus.h(Windows 驱动程序工具包中的标头文件)中定义。 有关详细信息,请参阅 Windows 驱动程序工具包中的头文件

注解

如果不具备调试此问题的能力,可以使用蓝屏数据中描述的一些基本故障排除技巧。 如果在错误检查消息中标识了驱动程序,请禁用该驱动程序,或与制造商联系以获取驱动程序更新。

硬件不兼容

确保安装的任何新硬件都与已安装的 Windows 版本兼容。 例如,可以从 Windows 10 规格中获取所需硬件的相关信息。

设备驱动程序或系统服务存在故障

设备驱动程序或系统服务故障可能会导致此错误。 硬件问题(如 BIOS 不兼容、内存冲突和 IRQ 冲突)也可能会产生此错误。

如果错误检查消息中按名称列出了某个驱动程序,请禁用或删除该驱动程序。 禁用或删除最近添加的所有驱动程序或服务。 如果在启动过程中发生错误,并且系统分区格式化为 NTFS 文件系统,则可以使用安全模式禁用设备管理器中的驱动程序。

在事件查看器中检查系统日志以获取更多错误消息,这可能有助于识别导致 Bug 检查 0x1E 的设备或驱动程序。 同时运行系统制造商提供的硬件诊断程序,尤其是内存扫描程序。 有关这些故障排除步骤的详细信息,请参阅计算机的用户手册。

出现此消息的错误可能会发生在 Windows 安装过程中首次重启后或安装完成后。 可能导致错误的原因是系统 BIOS 不兼容。 可以通过升级系统 BIOS 版本来解决 BIOS 问题。

解决方法

在调试此问题时,可能会发现很难获得堆栈跟踪。 异常地址(参数 2)应标识导致问题的驱动程序或函数。

异常代码 0x80000003 表示命中了硬编码断点或断言,但系统是使用 /NODEBUG 开关启动的。 此问题应该很少发生。 如果重复发生,请确保内核调试器已连接,并且已使用 /DEBUG 开关启动系统。

如果出现异常代码 0x80000002,陷阱帧会提供更多信息。

未知原因

如果异常的具体原因未知,可考虑使用以下步骤来获取堆栈跟踪。

注意

此步骤假定你可以找到 NT!PspUnhandledExceptionInSystemThread。 但是,在某些情况下,例如在访问违规崩溃时,你将无法找到 NT!PspUnhandledExceptionInSystemThread。 在这种情况下,请查找 ntoskrnl!KiDispatchException。 传递给此函数的第三个参数是陷阱帧地址。 使用包含此地址的 .trap(显示陷阱帧)命令将寄存器上下文设置为正确值。 然后就可以进行堆栈跟踪并发出其他命令。

获取堆栈跟踪

如果正常的堆栈跟踪程序失败,则获取堆栈跟踪:

  1. 使用 kb(显示堆栈回溯)命令来显示堆栈回溯中的参数。 查找对用 NT!PspUnhandledExceptionInSystemThread 的调用。 (如果未列出此函数,请参阅前面的注释。)

  2. NT!PspUnhandledExceptionInSystemThread 的第一个参数是指向一个结构的指针。 该指针包含指向 except 语句的指针:

    typedef struct _EXCEPTION_POINTERS {
        PEXCEPTION_RECORD ExceptionRecord;
        PCONTEXT ContextRecord;
        } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
    
    ULONG PspUnhandledExceptionInSystemThread(
        IN PEXCEPTION_POINTERS ExceptionPointers
        )
    

    对该地址使用 dd(显示内存)命令以显示所需的数据。

  3. 第一个检索值是异常记录。 对于异常记录,请使用 .exr(显示例外记录)命令。

    第二个值是上下文记录。 对于上下文记录,请使用 .cxr(显示上下文记录)命令。

  4. 在执行 .cxr 命令后,使用 kb 命令显示基于上下文记录信息的堆栈跟踪。 该堆栈跟踪指明了发生未处理异常的调用堆栈。

示例错误检查

下面的示例显示了 x86 处理器上的错误检查 0x1E:

kd> .bugcheck                 get the bug check data
Bugcheck code 0000001e
Arguments c0000005 8013cd0a 00000000 0362cffff

kd> kb                        start with a stack trace 
FramePtr  RetAddr   Param1   Param2   Param3   Function Name 
8013ed5c  801263ba  00000000 00000000 fe40cb00 NT!_DbgBreakPoint 
8013eecc  8013313c  0000001e c0000005 8013cd0a NT!_KeBugCheckEx+0x194
fe40cad0  8013318e  fe40caf8 801359ff fe40cb00 NT!PspUnhandledExceptionInSystemThread+0x18
fe40cad8  801359ff  fe40cb00 00000000 fe40cb00 NT!PspSystemThreadStartup+0x4a
fe40cf7c  8013cb8e  fe43a44c ff6ce388 00000000 NT!_except_handler3+0x47
00000000  00000000  00000000 00000000 00000000 NT!KiThreadStartup+0xe

kd> dd fe40caf8 L2            dump EXCEPTION_POINTERS structure
0xFE40CAF8  fe40cd88 fe40cbc4                   ..@...@.

kd> .exr fe40cd88             first DWORD is the exception record
Exception Record @ FE40CD88:
   ExceptionCode: c0000005
  ExceptionFlags: 00000000
  Chained Record: 00000000
ExceptionAddress: 8013cd0a
NumberParameters: 00000002
   Parameter[0]: 00000000
   Parameter[1]: 0362cfff

kd> .cxr fe40cbc4             second DWORD is the context record
CtxFlags: 00010017
eax=00087000 ebx=00000000 ecx=03ff0000 edx=ff63d000 esi=0362cfff edi=036b3fff
eip=8013cd0a esp=fe40ce50 ebp=fe40cef8 iopl=0         nv dn ei pl nz ac po cy
vip=0    vif=0
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010617
0x8013cd0a  f3a4             rep movsb

kd> kb                        kb gives stack for context record
ChildEBP RetAddr  Args to Child
fe40ce54 80402e09 ff6c4000 ff63d000 03ff0000 NT!_RtlMoveMemory@12+0x3e
fe40ce68 80403c18 ffbc0c28 ff6ce008 ff6c4000 HAL!_HalpCopyBufferMap@20+0x49
fe40ce9c fe43b1e4 ff6cef90 ffbc0c28 ff6ce009 HAL!_IoFlushAdapterBuffers@24+0x148
fe40ceb8 fe4385b4 ff6ce388 6cd00800 ffbc0c28 QIC117!_kdi_FlushDMABuffers@20+0x28
fe40cef8 fe439894 ff6cd008 ffb6c820 fe40cf4c QIC117!_cqd_CmdReadWrite@8+0x26e
fe40cf18 fe437d92 ff6cd008 ffb6c820 ff6e4e50 QIC117!_cqd_DispatchFRB@8+0x210
fe40cf30 fe43a4f5 ff6cd008 ffb6c820 00000000 QIC117!_cqd_ProcessFRB@8+0x134
fe40cf4c 80133184 ff6ce388 00000000 00000000 QIC117!_kdi_ThreadRun@4+0xa9
fe40cf7c 8013cb8e fe43a44c ff6ce388 00000000 NT!_PspSystemThreadStartup@8+0x40