您的位置:首页 > 电脑常识电脑常识

电脑死机的排查及解决方法(电脑蓝屏什么原因)

2025-05-08人已围观

电脑死机的排查及解决方法(电脑蓝屏什么原因)
  即使现在的系统相比 20 年前已经稳定了很多了,使用电脑时也难免会遇到蓝屏、意外重启、甚至是意外关机的情况。尽管这种问题可能只是偶然发生,可以说是不太走运;但更多的时候放着不管,反而会让电脑的问题出现得越来越频繁。

  电脑蓝屏什么原因

  一个蓝屏小「贴士」

  所以,这篇文章就旨在帮助大家快速找到让电脑不能正常工作的罪魁祸首,虽然不一定能「药到病除」,但也能让你离正确答案更近一步。

  Windows

  除了 macOS,Windows 系统日志同样可以在时间查看器中查看并进行筛选,但考虑界面相对「复古」且用于筛选的 UI 选项更为复杂,因此我也更推荐大家使用命令行工具获取和筛选日志。

  有的时候用 UI 界面反而会让一件事情变得更复杂

  如果你的 PC 电脑近期出现了意外重启等问题,不妨跟着下面的步骤试一试:

  Get-EventLog 是 Windows 中获取日志的命令,-LogName System 则限定了查找由系统生成的命令。-Source 则是来源,User32 和 Microsoft-Windows-Kernel-Power 则是两个不同的来源。

  从用户或程序层面进行分析

  User32 是一个 Windows 系统应用程序源,它包含了许多与用户界面相关的函数,如窗口创建、消息处理、控件操作等等;它还会负责处理用户交互方面的任务,例如鼠标、键盘输入和窗口管理等。因此由用户或是程序发起的事件,如登录、注销、锁定或解锁计算机等,都可以通过 User32 来源来定位。而后 | 用于进一步处理 Get-EventLog 得到的数据,这里按照 EventID事件 ID 来group 成组。

  目前我电脑中只有 1074 这个事件,这个 1074 事件是计算机的正常关机的主要表现形式。如果 User32 有其他的 EventID 那么用下面的命令进一步分析:

  前面的命令就不再赘述了,-Newest 1 表示选取最近的一个日志, | 用于进一步筛选 Get-EventLog 得到的数据。Where-Object 表示筛选一个对象数组,$_ 表示当前处理的对象(也就是 | 传递过来的数据 ),.EventID 表示对象的 EventID 属性,-eq 是一个比较运算符,表示等于,这里等于的 1074 这个事件。| 依然是用于进一步处理 Where-Object 得到的数据,由 fl(也可以用完整写法 Format-List 替代)格式化输出对象的*所有属性。

  找到其中的 Reason Code: 0x80020010 可以得知这是一个计划内的关机请求,如果不是服务器的话,这一般由 Windows Update 自动更新发起;而由用户发起的关机则会被标识为 0x0。以下是常见的 Reason Code 所表示的含义,完整列表可以参见这里:

  值

  含义

  0x00040000/0x00030000

  应用/软件问题导致关机/重启

  0x00010000

  硬件问题导致关机/重启

  0x00020000

  操作系统问题导致关机/重启

  0x00060000

  电源问题导致的关机

  0x00050000

  系统(通常指的是 UEFI)问题导致关机/重启

  0x0000000F

  蓝屏问题导致关机/重启

  0x0000000b

  电源断开导致的关机

  0x00000007

  硬盘问题导致关机/重启

  0x0000000d

  驱动问题导致关机/重启

  0x00000005

  系统长时间无响应导致关机/重启

  蓝屏问题导致关机或重启,还可以进一步下方的命令进行分析。

  从电源管理相关的事件入手进行分析

  不过很多意外关机的事件,比如蓝屏导致的,无法被 User32 捕获,因此从Microsoft-Windows-Kernel-Power 获取电源状态、电源事件以及与电源管理相关的错误和警告信息得到更多的信息。

  代码中相似的内容不再赘述,在Microsoft-Windows-Kernel-Power和意外关机有关的 EventID 是 41,这个事件通常是在意外关机后重启的阶段中生成的。输入上面的命令以后,Powershell 会输出一段包含十进制 BugcheckCode 的内容,首先需要将它转换为十六进制,以做进一步分析。

  如 159 等同于 0x0000009f,209 等同于 0x000000d1 等等,转换后的十六进制就可以得到最终的含义了。BugcheckCode 内容也和蓝屏时输出的错误码是相同的内容,有的时候蓝屏代码一跳而过,所以这也是找到问题的好办法。以下是常见的错误的代码以及含义,完整列表请看这里:

  代码

  名称

  含义

  0x0000009f

  DRIVER_POWER_STATE_FAILURE

  驱动程序所请求的电源状态不一致需要降级或更换驱动

  0x000000d1

  DRIVER_IRQL_NOT_LESS_OR_EQUAL

  驱动程序试图访问可分页内存,但中断太多需要降级或更换驱动

  0x00000024

  NTFS_FILE_SYSTEM

  NTFS 文件系统出现问题,检查文件系统或者更换硬盘

  0x000000f3

  DISORDERLY_SHUTDOWN

  由于内存不足而无法关机检查内存或添加更多的内存

  0x0000001a

  MEMORY_MANAGEMENT

  内存问题内存接触不良,或是其他内存问题

  0x00000034

  CACHE_MANAGER

  文件系统的缓存管理器问题重装电脑,或者加大非分页池内存

  0x000000EF

  CRITICAL_PROCESS_DIED

  关键系统进程已终止需要修复系统,或者重装系统

  由于错误码的种类繁多,因此这里不太可能一一列举。另外还需要注意的是,同一个错误可能会有不同的原因而导致,排查时可以从近期的软件改动入手去寻找电脑意外关机的原因,排查完软件以后才是排查硬件的真正时机。

  关于 Powershell 7 使用中的一些细节

  值得注意的是,Get-EventLog只能使用 Windows 内的 Powershell 运行;Powershell 7 中因为相关 API 已被弃用,会提示无效指令,因此需要换用Get-WinEvent命令:

  Get-WinEvent 是 Powershell 7 中获取 Windows 日志的新命令,不同于此前的Get-EventLog能同时筛选具体的事件日志-LogName和事件源-Source;Get-WinEvent在使用时只能在筛选事件日志-Logname和事件源-ProviderName中二选一。Get-WinEvent 还可以使用一个新的写法 -FilterHashtable,降低命令长度的同时提高索引效率。

  以上就是本文的全部内容了,希望可以在未来帮助到你。


  106080
 

很赞哦! ()

随机图文