BSOD - 错误检查的含义?

cr0*_*z3r 4 windows-7 crash bsod

今天登录 Windows 7 时,我的电脑立即蓝屏了。使用 WhoCrashed 我得到以下报告:

——

  • 在 2013 年 2 月 12 日星期二 13:56:20 GMT,您的计算机崩溃了
  • 崩溃转储文件: C:\Windows\Minidump\021213-27390-01.dmp
  • 正常运行时间: 00 : 00 : 25
  • 这可能是由以下模块引起的: ntoskrnl.exe (nt+0x1AA698)
  • 错误检查代码: 0x1000007E(0xFFFFFFC0000096、0xFFFFF80003610698、0xFFFFF8800614C7B8、0xFFFFF8800614C010)
  • 错误: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M
  • 文件路径: C:\Windows\system32\ntoskrnl.exe
  • 产品: Microsoft® Windows® 操作系统
  • 公司:微软公司
  • 描述: NT内核和系统
  • 错误检查描述:这表明系统线程生成了错误处理程序未捕获的异常。

这似乎是一个典型的软件驱动程序错误,不太可能是由硬件问题引起的。崩溃发生在 Windows 内核中。可能这个问题是由目前无法识别的另一个驱动程序引起的。

——

现在,我的 PC偶尔会崩溃/死机,并且在过去执行特定的重性能任务时,它的原因(我认为)是我的主板中的 RAM 插槽有缺陷。保持该插槽为空停止崩溃。

今天,它又崩溃了,我没有改变任何与硬件相关的东西。

我知道我可以去谷歌阅读这个错误检查代码的含义,但最近我开始意识到来自某人(具有相同的错误检查/问题)的个人经验更有用,特别是因为这个人可能已经来了解决方案。

非常感谢!

Ian*_*oyd 11

在这种情况下,一个线程遇到了异常

C0000096: STATUS_PRIVILEGED_INSTRUCTION
          Executing an instruction not allowed in current machine mode.
Run Code Online (Sandbox Code Playgroud)

此错误是由 CPU 本身引发的。某些代码试图执行不允许执行的指令。这可能是由内存损坏引起的;内核代码试图执行垃圾数据的地方。

这种错误确实无法查明。“内核”代码中有一个不应该发生的错误。Microsoft 的任何代码中都不太可能存在软件错误。这就是你开始寻找别处的时候。

  • 第三方驱动程序。内核模式驱动器可以完全访问物理硬件。任何第 3 方驱动程序(例如视频、声音、网络、USB 3.0、SATA)中的任何杂散错误都可能损坏系统中任何其他内容的代码或数据。下一步:尝试删除新添加的硬件(因此未加载某些第三方驱动程序),尝试以安全模式启动(因此未加载某些第三方驱动程序),或重新安装 Windows(因此未加载某些第三方驱动程序)
  • 坏内存。如果有一点被翻转,它将一个完全良性的指令变成了一个不同的、无效的指令,你可能会得到这个错误。下一步:移除 RAM 棒,将 RAM 移动到其他插槽,解锁 RAM,更换电源
  • 超频。有时超频时会发生非常奇怪的事情。希望每个人都向微软发送他们的崩溃转储;因为微软确实在调查他们。他们会得到的一个常见错误是 CPU 执行指令时:

    xor eax, eax;
    
    Run Code Online (Sandbox Code Playgroud)

    这是 CPU 可以执行的异常简单的操作;它只是将内部 CPU 寄存器EAX设置为零。有没有办法可以失败; 除非您超频 - 或其他身体问题。

tl;dr:如果你去掉了软件,那就是硬件。

更新:故障排除方法

我想提一下我经历的细节,在查看这个错误时几乎是无意识的。

第一个是实际的错误检查代码:

0x1000007E - SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M
Run Code Online (Sandbox Code Playgroud)

在 Google 上绑定它会提供 Microsoft 文档页面

错误检查 0x1000007E:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M

这表明系统线程生成了错误处理程序未捕获的异常。

我知道,根据作为开发人员的经验,如果我的应用程序(或其一个线程)遇到“异常”,而我不“处理”异常,Windows 最终将通过终止应用程序来处理它。如果在内核模式下发生未处理的异常,操作系统别无选择,只能通过关闭内核来处理它。我感兴趣的是抛出了哪个 异常。我认为(事实证明是错误的)这是“访问冲突”

我知道所有错误检查都伴随着四个描述实际发生情况的参数:

  • 参数 1:0xFFFFFFFFC0000096
  • 参数 2:0xFFFFF80003610698
  • 参数 3:0xFFFFF8800614C7B8
  • 参数 4:0xFFFFF8800614C010

但这些到底是什么意思?!那是我们回到文档页面的时候,它没有描述它们。但它确实说:

错误检查 0x1000007E 与错误检查 0x7E (SYSTEM_THREAD_EXCEPTION_NOT_HANDLED)具有相同的含义和参数。

优秀。另一个页面记录了参数:

SYSTEM_THREAD_EXCEPTION_NOT_HANDLED 参数

以下参数出现在蓝屏上。

  • 参数1:未处理的异常代码
  • 参数2:异常发生的地址
  • 参数3:异常记录地址
  • 参数4:上下文记录的地址

这就是我想要的,未处理的异常代码。在您的情况下,它是异常代码:

0xFFFFFFFFC0000096
Run Code Online (Sandbox Code Playgroud)

根据经验,我知道您在 64 位 Windows 上运行,因为该代码是 64 位长。我真的只想要较低的 32 位:

0xC0000096
Run Code Online (Sandbox Code Playgroud)

通常我会期望winerror.h在我的开发目录中找到该错误代码;但它不在那里。花了一些 Binging,但我发现搜索:

winerror C0000096

把我带到一个关于winehq的页面,它声明了常量:

STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096
Run Code Online (Sandbox Code Playgroud)

坚持不懈地为我带来了一个规范的 Microsoft 文档页面

硬件异常

STATUS_PRIVILEGED_INSTRUCTION: 执行当前机器模式下不允许的指令。

我也知道这个异常是由 CPU本身抛出的。我知道因为“特权指令”意味着您试图执行您不允许的 CPU 指令。我也可以知道这一点,因为该页面称为Hardware Exceptions

所以我们正处于一些代码正在运行的时候,试图执行它不应该执行的 CPU 指令。有两种可能:

  • 内存已损坏;该软件不是为了尝试执行该代码而编写的,但这就是在 RAM 中结束的内容
  • 它确实是有缺陷的软件,它试图做一些它不允许的事情。

鉴于微软的代码每天都在数百万台机器上不断地进行现场测试,更有可能:

  • 你的硬件有问题
  • 其他人代码中的错误导致问题

无论如何,这是怎么我的工作是检测错误。也许通过了解我是如何经历的,它可以在您下次进行错误检查时为您提供帮助。