Windows服务器蓝屏如何排查?事件日志、驱动与内存诊断方法

服务器蓝屏(BSOD,Blue Screen of Death,微软文档里叫 Bug Check 或 Stop Error)是 Windows 运维里最让人紧张的一类故障——它意味着内核主动停止了系统,且通常伴随业务中断。更麻烦的是:多数服务器默认勾选了“自动重新启动”,蓝屏界面一闪而过,等你远程连上,只看到一台“刚重启过”的机器,什么线索都没留下。

本文按真实排查顺序组织:先把蓝屏信息留下来,再从事件日志读停码,然后围绕驱动、内存、磁盘、系统文件四条主线逐项验证,最后给出常见停机码速查表与完整排查清单。

一、第一步:让蓝屏把话说完,并留下转储文件

1.1 关闭自动重启

路径:sysdm.cpl → 高级 → “启动和故障恢复” → 设置 → 取消勾选“自动重新启动”。这样蓝屏会停在屏幕上,方便拍照或现场查看停码。命令行方式:

REM 查看当前故障恢复配置(DebugInfoType:0=无 1=完整转储 2=内核转储 3=小内存转储)
wmic recoveros get DebugInfoType, DebugFilePath, MiniDumpDirectory, AutoReboot, WriteToSystemLog

REM 关闭自动重启,便于现场看到蓝屏
wmic recoveros set AutoReboot = false
wmic recoveros set WriteToSystemLog = true

REM 设置为"内核内存转储"(兼顾信息量与体积,服务器常用)
wmic recoveros set DebugInfoType = 2

1.2 确认转储配置

转储文件是定位根因的关键证据:完整转储在 %SystemRoot%\MEMORY.DMP,小内存转储在 %SystemRoot%\Minidump\*.dmp。很多机器没有 DMP 文件,原因往往是页面文件太小或被禁用——系统盘页面文件至少要几百 MB 才能写 minidump,完整转储需要页面文件大于物理内存。

REM 查看注册表配置
reg query "HKLM\SYSTEM\CurrentControlSet\Control\CrashControl"

REM 常见配置项:
REM   CrashDumpEnabled  0=无 1=完整 2=内核 3=小内存转储(默认)
REM   DumpFile          完整转储路径,默认 %SystemRoot%\MEMORY.DMP
REM   MinidumpDir       默认 %SystemRoot%\Minidump
REM   Overwrite         1=覆盖旧文件
REM   AutoReboot        1=自动重启

REM 检查是否已有转储文件
dir %SystemRoot%\MEMORY.DMP
dir %SystemRoot%\Minidump /a

二、第二步:从事件日志取出停码

即使没有 DMP,事件日志里也几乎一定会留下痕迹。三个必查事件:Kernel-Power 41(意外关机,附带 BugcheckCode)、1001(WER 记录的 BugCheck 详情)、6008(上一次意外关机)。

REM 用 wevtutil 按事件 ID 倒序查询
wevtutil qe System "/q:*[System[(EventID=41)]]" /f:text /c:10 /rd:true
wevtutil qe System "/q:*[System[(EventID=1001)]]" /f:text /c:10 /rd:true
wevtutil qe System "/q:*[System[(EventID=6008)]]" /f:text /c:5 /rd:true
# PowerShell:查看 Kernel-Power 41,重点看 BugcheckCode 与 BugcheckParameter1
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-Kernel-Power'; Id=41} -MaxEvents 10 |
  Select-Object TimeCreated,
    @{n='BugcheckCode';e={[Convert]::ToString($_.Properties[1].Value,16)}},
    @{n='P1';e={[Convert]::ToString($_.Properties[2].Value,16)}},
    @{n='PowerButtonTimestamp';e={$_.Properties[4].Value}}

# BugCheck 详细报告(1001)
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-WER-SystemErrorReporting'; Id=1001} -MaxEvents 5 |
  Format-List TimeCreated, Message

# 硬件错误(WHEA):CPU 缓存、PCIe、内存不可纠正错误都在这里
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-WHEA-Logger'} -MaxEvents 20 -ErrorAction SilentlyContinue |
  Select-Object TimeCreated, Id, LevelDisplayName, Message

# 老系统兼容写法
Get-EventLog -LogName System -Newest 200 |
  Where-Object { $_.EventID -in 41,1001,6008,6005,6006 } |
  Select-Object TimeCreated, EventID, Source, Message

另外两条常被忽略但极有价值的日志源:Ntfs(事件 55,文件系统损坏,通常意味着要跑 chkdsk) 与 Disk / storahci / storport(事件 7/11/129/153,磁盘坏块或 IO 超时)。磁盘问题引发的内核崩溃占比不低,尤其在老机械盘和廉价 SSD 上。

Get-EventLog -LogName System -Newest 500 |
  Where-Object { $_.Source -in 'Disk','Ntfs','storahci','storport','volsnap','disk' } |
  Select-Object TimeCreated, EventID, Source, EntryType | Format-Table -AutoSize

拿到十六进制停码后(例如 0x000000D1),对照下表初步判断方向。

停码名称最可能的原因优先排查对象
0x0000000AIRQL_NOT_LESS_OR_EQUAL驱动在不正确的 IRQL 访问分页内存第三方驱动
0x000000D1DRIVER_IRQL_NOT_LESS_OR_EQUAL同上,多由网卡/存储/杀软驱动触发驱动签名与版本
0x0000001AMEMORY_MANAGEMENT内存管理结构损坏物理内存、ECC 日志
0x00000050PAGE_FAULT_IN_NONPAGED_AREA访问无效的非分页内存内存、驱动、磁盘
0x0000003BSYSTEM_SERVICE_EXCEPTION系统调用中执行异常驱动、杀软、显卡/存储
0x0000007ESYSTEM_THREAD_EXCEPTION_NOT_HANDLED系统线程未处理异常最近安装的驱动/更新
0x0000009FDRIVER_POWER_STATE_FAILURE驱动未正确响应电源状态切换电源管理驱动、网卡
0x000000C2BAD_POOL_CALLER错误的内存池释放第三方驱动 Bug
0x00000124WHEA_UNCORRECTABLE_ERROR硬件不可纠正错误CPU / 内存 / PCIe 硬件故障
0x00000133DPC_WATCHDOG_VIOLATION某驱动 DPC 执行超时存储(storahci/iaStor)、网卡驱动
0x000000EFCRITICAL_PROCESS_DIED关键系统进程退出系统文件、磁盘、恶意软件
0x0000007BINACCESSIBLE_BOOT_DEVICE无法访问启动卷存储驱动、磁盘策略、RAID 卡

三、第三条线:驱动排查

统计上,Windows 蓝屏的大头是第三方内核驱动:杀毒软件、备份 Agent、虚拟网卡、存储控制器、监控探针。排查思路是列出驱动、看签名和版本、必要时回滚或卸载。

REM 列出所有已安装驱动(含路径、类型、启动模式)
driverquery /v /fo list

REM 只看未签名的驱动(重点嫌疑对象)
driverquery /si | findstr /i "FALSE"

REM 导出到 CSV 便于比对
driverquery /v /fo csv > C:\drivers_%DATE:~0,10%.csv
REM 列出第三方驱动包并卸载(oemNN.inf 从前面列表获取)
pnputil /enum-drivers
pnputil /delete-driver oem12.inf /uninstall /force
# PowerShell:列出非微软签名驱动
Get-WindowsDriver -Online -All |
  Where-Object { $_.ProviderName -notmatch 'Microsoft' } |
  Select-Object Driver, ProviderName, Version, Date, ClassName |
  Sort-Object ProviderName | Format-Table -AutoSize

# 按签名者分组统计
Get-CimInstance Win32_SystemDriver |
  Where-Object { $_.PathName } |
  Select-Object Name, DisplayName, State, StartMode, PathName |
  Where-Object { $_.State -eq 'Running' } | Format-Table -AutoSize

图形化工具:msinfo32 → 软件环境 → 系统驱动程序;sigverif.exe 可批量扫描未签名驱动。这两个工具在给厂商发工单时附上截图,很有说服力。

3.1 驱动程序验证器(慎用)

当常规手段查不出,且能接受再次蓝屏时,可以启用 Driver Verifier 主动压力测试驱动:verifier → 创建标准设置 → 自动选择这台计算机上安装的所有驱动 → 重启。它会严格检查驱动的内存和 IRQL 行为,一旦发现问题就触发蓝屏并明确指出是哪个驱动。

REM 查看当前验证器设置
verifier /querysettings

REM 启用标准验证(重启后生效,可能导致反复蓝屏)
verifier /standard /all

REM 只验证指定驱动(更安全的选择)
verifier /standard /driver MyDriver.sys

REM 关闭验证器(必须执行,否则永久影响性能)
verifier /reset

严重警告:Driver Verifier 会导致系统显著变慢并可能进入无法启动的蓝屏循环。生产环境绝对不要开;测试环境使用后务必 verifier /reset,必要时进安全模式重置。

3.2 回滚最近变更

如果蓝屏出现的时间点很明确,优先怀疑“最近动过什么”:新装的驱动、新打的补丁、新上的软件。

# 查看最近安装的补丁
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10 HotFixID, InstalledOn, Description

# 卸载指定补丁
wusa /uninstall /kb:5034123 /quiet /norestart

# DISM 方式查看已安装包
DISM /Online /Get-Packages /Format:Table

四、第四条线:内存诊断

内存故障的典型表现是随机、无规律的崩溃,停码每次还都不一样(0x1A、0x50、0x3B 轮换出现)。排查手段分三层。

4.1 先确认配置与 ECC 状态

# 查看物理内存条信息
Get-CimInstance Win32_PhysicalMemory |
  Select-Object BankLabel, DeviceLocator, Manufacturer, PartNumber, Speed,
    @{n='CapacityGB';e={$_.Capacity/1GB}}, SerialNumber, TotalWidth, DataWidth |
  Format-Table -AutoSize

# 总容量
(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB

# 判断 ECC:TotalWidth(72) 大于 DataWidth(64) 即为 ECC 内存
wmic memphysical get MaxCapacity, MemoryDevices, UseEcc

4.2 运行 Windows 内存诊断

执行 mdsched.exe(开始菜单搜索“Windows 内存诊断”),选择“立即重新启动并检查问题”,或计划下次启动时运行。检测完成后会自动重启。

REM 立即重启并运行内存诊断(会打断业务,需停机窗口)
mdsched.exe

REM 通过命令行调度(bcdedit 方式)
bcdedit /set {current} bootstatuspolicy ignoreallfailures

结果不会直接弹窗,需要到事件查看器查看:应用程序和服务日志 → Microsoft → Windows → MemoryDiagnostics-Results。或者用命令:

Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-MemoryDiagnostics-Scheduler'} -MaxEvents 5 -ErrorAction SilentlyContinue | Format-List TimeCreated, Message
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='MemoryDiagnostics-Results'} -MaxEvents 5 -ErrorAction SilentlyContinue | Format-List TimeCreated, Message

说明:Windows 内置诊断强度有限,跑 1~2 个 pass 常常查不出间歇性故障。怀疑内存时更可靠的做法是用 MemTest86+ 做 U 盘启动,跑满 4 个 pass 以上,服务器内存量大时可能需要数小时。若发现错误,通过拔插法逐条定位到具体 DIMM 槽位。

五、第五条线:磁盘与系统文件

REM 文件系统一致性检查(/f 修复错误,/r 定位坏扇区并恢复数据,系统盘需重启)
chkdsk C: /f
chkdsk D: /f /r

REM 在线扫描(无需重启,Server 2012+)
Repair-Volume -DriveLetter C -Scan
Repair-Volume -DriveLetter C -OfflineScanAndFix
# 查看物理磁盘健康状态(SMART 相关数据,依赖磁盘/阵列卡是否上报)
Get-PhysicalDisk | Select-Object FriendlyName, MediaType, HealthStatus, OperationalStatus, Size
Get-PhysicalDisk | Get-StorageReliabilityCounter |
  Select-Object DeviceId, Temperature, ReadErrorsTotal, WriteErrorsTotal, Wear, PowerOnHours |
  Format-Table -AutoSize

# 传统 WMI 方式
Get-CimInstance Win32_DiskDrive | Select-Object Model, Status, Size, SerialNumber
REM 系统文件完整性:先修组件存储,再修系统文件(顺序不能反)
DISM /Online /Cleanup-Image /ScanHealth
DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow

REM 只校验不修复
sfc /verifyonly

如果 sfc 报告“发现损坏文件但无法修复”,通常要用 DISM 指定源镜像(/Source:WIM:D:\sources\install.wim:1),或挂载同版本 ISO 后用 /Source:D:\sources\install.wim。修复完成后重跑 sfc /scannow 确认为“未找到完整性冲突”。

六、完整排查步骤清单

  1. 关闭自动重启,确认已生成 MEMORY.DMP 或 Minidump 文件(没有则检查页面文件与 CrashControl 配置)。
  2. 查 Kernel-Power 41 / 1001 / 6008 事件,取出 BugcheckCode 与参数。
  3. 对照停码速查表判断方向:驱动 / 内存 / 磁盘 / 系统文件。
  4. 用 driverquery /si 检查未签名驱动,用 Get-HotFix 核对最近补丁与蓝屏时间点的关系。
  5. 查 WHEA-Logger 日志,有 18/19/20 类事件则直接指向硬件,走厂商报修流程。
  6. 查 Disk / Ntfs / storahci 源日志,判断是否存在磁盘 IO 问题。
  7. 在停机窗口运行 mdsched.exe 或 MemTest86+ 做内存检测。
  8. 运行 chkdsk /f 与 Get-StorageReliabilityCounter 检查磁盘健康。
  9. 执行 DISM /RestoreHealth + sfc /scannow 修复系统文件。
  10. 有条件时用 WinDbg 打开 DMP 执行 !analyze -v,看 MODULE_NAME / IMAGE_NAME 字段确定责任模块。
  11. 测试环境可用 Driver Verifier 精确定位,用后立即 verifier /reset。
  12. 修复后观察至少一个完整业务周期,并记录故障时间线备查。

小结与避坑建议

Windows 服务器蓝屏排查的核心逻辑是:停码指方向,DMP 定模块,日志补上下文,工具做验证。绝大多数蓝屏并非 Windows 自身的锅,而是第三方内核驱动、内存硬件故障或磁盘介质损坏。养成“先留证据再重启”的习惯,能把排查时间从几天压缩到几十分钟。

几条实战经验:

  • 不要一蓝屏就重装系统。重装会抹掉所有证据,而且如果是硬件问题,换来的是周期性复发。
  • 页面文件不要设成 0。没有页面文件就没有转储文件,等于放弃了唯一的精确证据。服务器建议至少保留 800 MB ~ 数 GB。
  • Kernel-Power 41 的 BugcheckCode 为 0 时,说明不是蓝屏而是断电/强制关机/虚拟化层重启,此时要查电源、UPS 和宿主机。
  • 反复出现 0x124 WHEA 基本可以判硬件死刑。不要再花时间在软件上,直接联系硬件厂商,带上 WHEA 日志和 DMP。
  • 杀软/备份/Agent 是高频嫌疑犯。很多跨版本升级后蓝屏,都是老版本内核驱动不兼容新系统。养成升级系统前先确认 Agent 兼容性的习惯。
  • 生产环境禁用 Driver Verifier。它本身就是用来制造蓝屏的工具,误开等于自己发起一次故障。
  • 建立基线。服务器上线时导出一份驱动列表和补丁列表,出问题时做 diff,比从头翻快得多。