今天登录 Windows 7 时,我的 PC 立即出现 BSOD。使用 WhoCrashed 我得到以下报告:
--
- 2013 年 2 月 12 日星期二 13:56:20 GMT 您的计算机崩溃
- 崩溃转储文件:C:\Windows\Minidump\021213-27390-01.dmp
- 正常运行时间:00:00:25
- 这可能是由以下模块引起的:ntoskrnl.exe (nt+0x1AA698)
- 错误检测代码:0x1000007E (0xFFFFFFFFC0000096, 0xFFFFF80003610698, 0xFFFFF8800614C7B8, 0xFFFFF8800614C010)
- 错误:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M
- 文件路径:执行文件目录:\Windows\system32\ntoskrnl.exe
- 产品:Microsoft® Windows® 操作系统
- 公司:微软公司
- 描述:NT 内核和系统
- 错误检查描述:这表明系统线程产生了错误处理程序未捕获的异常。
这似乎是典型的软件驱动程序错误,不太可能是由硬件问题引起的。崩溃发生在 Windows 内核中。此问题可能是由目前无法识别的另一个驱动程序引起的。
--
现在,我的电脑崩溃/死机过去,我偶尔会在执行某些性能要求高的任务时遇到这种情况,但我认为,问题的原因是我主板上的 RAM 插槽有问题。将该插槽留空后,系统便不会崩溃。
今天它又崩溃了,我还没有更改任何与硬件相关的东西。
我知道我可以通过 Google 来了解这个错误检查代码的含义,但最近我意识到来自某人(具有相同的错误检查/问题)的个人经历更有用,特别是因为这个人可能已经找到了解决方案。
非常感谢!
答案1
在这种情况下,线程遇到了异常
C0000096: STATUS_PRIVILEGED_INSTRUCTION
Executing an instruction not allowed in current machine mode.
此错误由 CPU 本身引发。某些代码试图执行不允许执行的指令。这可能是由内存损坏引起的;内核代码试图执行垃圾数据。
这种错误确实无法确定。“核心”不应该发生的代码。微软代码中存在软件错误的可能性极小;这时您就会开始寻找其他地方。
- 第三方驱动程序。内核模式驱动器可以完全访问物理硬件。任何第三方驱动程序(例如视频、声音、网络、USB 3.0、SATA)中的任何杂散错误都可能损坏系统中任何其他东西的代码或数据。下一步:尝试删除新添加的硬件(这样就不会加载某些第三方驱动程序),尝试以安全模式启动(这样就不会加载某些第三方驱动程序),或重新安装 Windows(这样就不会加载某些第三方驱动程序)
- 坏 RAM如果某个位被翻转,并且它将一个完全良性的指令变成了一个不同的、无效的指令,那么就会出现此错误。下一步:移除 RAM 条,将 RAM 移至其他插槽,解锁 RAM,更换电源
超频。有时超频时会发生非常奇怪的事情。希望每个人都向 Microsoft 发送他们的崩溃转储;因为 Microsoft 确实会调查它们。他们会遇到的一个常见错误是当 CPU 执行指令时:
xor eax, eax;
这是 CPU 可以执行的一个非常简单的操作;它只是将内部 CPU 寄存器设置
EAX
为零。没有方式它可能会失败;除非你超频或出现其他物理问题。
tl;dr:如果您已经消除了软件,那么就该考虑硬件了。
更新:故障排除方法
我想提一下我在查看这个错误时几乎不假思索地经历的细节。
第一个是实际的错误检查代码:
0x1000007E - SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M
在 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
根据经验,我知道您正在运行 64 位 Windows,因为该代码长度为 64 位。实际上我只想要低 32 位:
0xC0000096
通常情况下,我本以为会在winerror.h
开发目录中找到该错误代码;但它不在那里。我花了一些时间搜索,但我发现搜索以下内容:
错误 C0000096
带我到葡萄酒之家,声明常量:
STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096
狂欢不断引领我规范的 Microsoft 文档页面:
硬件异常
STATUS_PRIVILEGED_INSTRUCTION
:执行当前机器模式下不允许的指令。
我也知道这个异常是由CPU抛出的本身我知道是因为“特权指令”意味着你试图执行一个不允许的 CPU 指令。我也能知道这一点,因为该页面被称为硬件异常。
因此,我们现在处于这样的情况:一些代码正在运行,试图执行一条不该执行的 CPU 指令。有两种可能性:
- 内存已损坏;软件并未尝试执行该代码,但该代码最终还是进入了 RAM
- 它确实是一个有缺陷的软件,它试图做一些不允许的事情。
鉴于微软的代码每天都在数百万台机器上进行现场测试,因此更有可能的是:
- 硬件有问题
- 其他人的代码中的错误导致了问题
无论如何,那是如何我处理了那个错误检查。也许通过了解我是如何解决的,它可以帮助您在下次进行错误检查时。