服务器蓝屏(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),对照下表初步判断方向。
| 停码 | 名称 | 最可能的原因 | 优先排查对象 |
|---|---|---|---|
| 0x0000000A | IRQL_NOT_LESS_OR_EQUAL | 驱动在不正确的 IRQL 访问分页内存 | 第三方驱动 |
| 0x000000D1 | DRIVER_IRQL_NOT_LESS_OR_EQUAL | 同上,多由网卡/存储/杀软驱动触发 | 驱动签名与版本 |
| 0x0000001A | MEMORY_MANAGEMENT | 内存管理结构损坏 | 物理内存、ECC 日志 |
| 0x00000050 | PAGE_FAULT_IN_NONPAGED_AREA | 访问无效的非分页内存 | 内存、驱动、磁盘 |
| 0x0000003B | SYSTEM_SERVICE_EXCEPTION | 系统调用中执行异常 | 驱动、杀软、显卡/存储 |
| 0x0000007E | SYSTEM_THREAD_EXCEPTION_NOT_HANDLED | 系统线程未处理异常 | 最近安装的驱动/更新 |
| 0x0000009F | DRIVER_POWER_STATE_FAILURE | 驱动未正确响应电源状态切换 | 电源管理驱动、网卡 |
| 0x000000C2 | BAD_POOL_CALLER | 错误的内存池释放 | 第三方驱动 Bug |
| 0x00000124 | WHEA_UNCORRECTABLE_ERROR | 硬件不可纠正错误 | CPU / 内存 / PCIe 硬件故障 |
| 0x00000133 | DPC_WATCHDOG_VIOLATION | 某驱动 DPC 执行超时 | 存储(storahci/iaStor)、网卡驱动 |
| 0x000000EF | CRITICAL_PROCESS_DIED | 关键系统进程退出 | 系统文件、磁盘、恶意软件 |
| 0x0000007B | INACCESSIBLE_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 确认为“未找到完整性冲突”。
六、完整排查步骤清单
- 关闭自动重启,确认已生成 MEMORY.DMP 或 Minidump 文件(没有则检查页面文件与 CrashControl 配置)。
- 查 Kernel-Power 41 / 1001 / 6008 事件,取出 BugcheckCode 与参数。
- 对照停码速查表判断方向:驱动 / 内存 / 磁盘 / 系统文件。
- 用
driverquery /si检查未签名驱动,用Get-HotFix核对最近补丁与蓝屏时间点的关系。 - 查 WHEA-Logger 日志,有 18/19/20 类事件则直接指向硬件,走厂商报修流程。
- 查 Disk / Ntfs / storahci 源日志,判断是否存在磁盘 IO 问题。
- 在停机窗口运行
mdsched.exe或 MemTest86+ 做内存检测。 - 运行
chkdsk /f与Get-StorageReliabilityCounter检查磁盘健康。 - 执行
DISM /RestoreHealth+sfc /scannow修复系统文件。 - 有条件时用 WinDbg 打开 DMP 执行
!analyze -v,看 MODULE_NAME / IMAGE_NAME 字段确定责任模块。 - 测试环境可用 Driver Verifier 精确定位,用后立即
verifier /reset。 - 修复后观察至少一个完整业务周期,并记录故障时间线备查。
小结与避坑建议
Windows 服务器蓝屏排查的核心逻辑是:停码指方向,DMP 定模块,日志补上下文,工具做验证。绝大多数蓝屏并非 Windows 自身的锅,而是第三方内核驱动、内存硬件故障或磁盘介质损坏。养成“先留证据再重启”的习惯,能把排查时间从几天压缩到几十分钟。
几条实战经验:
- 不要一蓝屏就重装系统。重装会抹掉所有证据,而且如果是硬件问题,换来的是周期性复发。
- 页面文件不要设成 0。没有页面文件就没有转储文件,等于放弃了唯一的精确证据。服务器建议至少保留 800 MB ~ 数 GB。
- Kernel-Power 41 的 BugcheckCode 为 0 时,说明不是蓝屏而是断电/强制关机/虚拟化层重启,此时要查电源、UPS 和宿主机。
- 反复出现 0x124 WHEA 基本可以判硬件死刑。不要再花时间在软件上,直接联系硬件厂商,带上 WHEA 日志和 DMP。
- 杀软/备份/Agent 是高频嫌疑犯。很多跨版本升级后蓝屏,都是老版本内核驱动不兼容新系统。养成升级系统前先确认 Agent 兼容性的习惯。
- 生产环境禁用 Driver Verifier。它本身就是用来制造蓝屏的工具,误开等于自己发起一次故障。
- 建立基线。服务器上线时导出一份驱动列表和补丁列表,出问题时做 diff,比从头翻快得多。
企业QQ咨询




