ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

深入Minidump:让蓝屏不再靠猜,精准锁定肇事驱动

深入Minidump:让蓝屏不再靠猜,精准锁定肇事驱动 蓝屏大概是Windows用户最不想见到的画面之一。屏幕突然变成深蓝色一行白字一闪而过还没等你看清错误代码电脑已经自动重启桌面重新出现的时候你只能对着上次蓝屏原因四个字发呆。更折磨人的是这种问题往往不是天天发作可能一周来一次或者恰好在你准备演示的前十分钟突然出现。如果你不想每次蓝屏都靠断电重启加碰运气过日子那Minidump小内存转储分析就是你最该掌握的一项技能。这篇文章我不绕弯子直接讲清楚三件事怎么让Windows在蓝屏时把现场信息完整留下来怎么用工具翻开Minidump文件以及怎么从满屏十六进制数据里锁定真正的肇事驱动。方法对新手友好对老手也够用。看完之后至少下次同事抱着电脑过来说又蓝屏了你能说出先让我看看dmp而不是跟着一起挠头。1. 蓝屏不是随机故障先搞懂Minidump里到底有什么1.1 一次蓝屏的完整过程先花两分钟理解蓝屏的本质。Windows内核态跑着一堆代码其中任何一层出了问题并被系统检测到内核就会强制停下所有操作进入一个被称为BugCheck的流程。所谓蓝屏就是BugCheck发生时屏幕上呈现的那一屏信息。它记录一个十六进制的错误代码比如0x0000000A、四个参数以及崩溃瞬间加载在内存里的驱动列表。很多人以为蓝屏是硬件突然坏了其实大多数蓝屏的现场都能通过转储文件还原。Windows在崩溃时会默认把一小部分内存内容写进一个叫Minidump的文件路径通常在C:\Windows\Minidump目录下。文件很小一般只有256KB左右存放的是崩溃瞬间的关键内存信息包括触发BugCheck的指令、当前正在运行的线程、堆栈回溯以及相关驱动模块的信息。这就相当于飞机上的黑匣子系统挂了但案发现场留了下来。1.2 Minidump里藏了哪些关键线索打开一个dmp文件你表面上看到的是大量十六进制输出但用工具解析之后能得到几类核心信息。第一BugCheck代码和四个参数。代码本身直接告诉你错误类型四个参数则是错误发生的上下文细节。比如0x0000003B的第二个参数通常指向出错的指令地址第四个参数指向出错的上下文。第二崩溃时的进程和线程。系统崩溃不会无缘无故总有一个线程正在运行时触发。这里能看到进程名比如是浏览器还是某个后台服务能帮你快速缩小排查范围。第三驱动模块列表和被标记的模块。如果系统在ntoskrnl.exe以外的模块里崩溃工具会直接标出来。很多蓝屏的真凶就是这么暴露的比如某个老显卡驱动、某款杀毒软件的内核驱动或者某个外设厂商的过时驱动。第四堆栈回溯。这是最值钱的信息能看到崩溃前最后调用的一串函数调用链。哪怕你看不懂每一层函数名光看最后几层是哪个.sys文件方向基本就清楚了。搞清楚这些下一步就是怎么让系统把现场完整保留下来。2. 案发现场保护让Windows每次蓝屏都留下Minidump2.1 检查系统当前转储配置Windows并不是默认把所有转储信息都完整写下来的有时候你蓝屏半天打开C:\Windows\Minidump发现里面是空的那就白折腾了。第一步先检查配置。按Win R输入sysdm.cpl打开系统属性切到高级选项卡在启动和故障恢复区域点设置就能看到写入调试信息的下拉框。下拉框里有几个选项无、小内存转储256KB、核心内存转储、自动内存转储、完全内存转储。系统默认通常是自动内存转储它会根据情况决定是否写入。但为了排查蓝屏我建议手动设成小内存转储256KB。原因很简单文件小、生成快、不占空间而且对99%的蓝屏排查来说这256KB的信息完全够用。2.2 手工开启小内存转储如果你发现下拉框里选不了或者改了不生效可以直接动注册表。打开注册表编辑器定位到HKLM\SYSTEM\CurrentControlSet\Control\CrashControl右边有个叫CrashDumpEnabled的DWORD值0表示不写入1表示完全内存转储2表示核心内存转储3表示小内存转储。改成3即可。顺手把旁边的MinidumpDir也看一眼这个值指定dmp文件存放目录默认是%SystemRoot%\Minidump。改完注册表建议重启一次系统确保内核配置被重新加载。这里有个大家容易忽略的点Minidump依赖页面文件pagefile.sys来写数据如果C盘被塞满了或者有人为了腾空间把页面文件彻底关了那你想分析也没得分析。保持C盘页面文件存在哪怕设置成系统管理的大小都行。2.3 转储配置的完整参数解读转储类型默认位置文件大小适用场景主要缺点小内存转储C:\Windows\Minidump256KB日常蓝屏排查首选信息量有限自动内存转储C:\Windows\MEMORY.DMP取决于内存占用官方默认文件体积大核心内存转储C:\Windows\MEMORY.DMP取决于内存占用内核调试占用较大完全内存转储C:\Windows\MEMORY.DMP约等于物理内存专家级分析巨大普通用户没必要实际使用中我见过不少朋友把完全内存转储当成更大更全来用结果32GB内存的机器每次蓝屏都往C盘丢几十GB文件几回就把系统盘塞爆。除非你是做内核驱动开发的普通用户选小内存转储就够了。毕竟我们要的是找到真凶不是把现场完整搬回家。3. 工具选择WinDbg和BlueScreenView怎么选3.1 WinDbg官方正统信息最全WinDbg是微软官方提供的调试器也是内核调试领域的老牌工具。现在它已经在Microsoft Store上架可以直接搜WinDbg安装也可以从Windows SDK包里安装。装完后用File Open Crash Dump打开dmp文件然后输入几个命令就能拿到大部分结论。第一个是!analyze -v。这个命令会自动分析崩溃转储输出BugCheck代码、参数、出错模块、堆栈回溯甚至在符号加载正常的情况下直接给你一个PROCESS_NAME和MODULE_NAME告诉你崩溃发生在哪个进程、哪个驱动文件里。这个命令是入门首选也是整篇文章的核心。第二个是lmvm加模块名。比如你知道崩溃模块是某个.sys用lmvm 模块名可以查看这个模块的详细信息包括文件版本、时间戳、完整路径。这个信息特别有用能帮你判断驱动是否是旧版本、是否来自第三方。WinDbg唯一的门槛是需要配置符号文件。符号文件PDB相当于把内存地址翻译成人话的字典。配置很简单在WinDbg里打开File Settings找到Debugging settings里的Symbol path填上srv*C:\Symbols*https://msdl.microsoft.com/download/symbols。公司网络有代理的话勾选Use Proxy Server并填上代理地址。符号缓存目录建议放在剩余空间比较大的分区符号文件下载起来从几十MB到几百MB都很正常。3.2 BlueScreenView5分钟快速定位如果你不想折腾WinDbg还有一个轻量工具叫BlueScreenView由NirSoft出品绿色软件解压即用。它会自动扫描C:\Windows\Minidump目录列出所有蓝屏记录直接显示崩溃时间、BugCheck代码、四个参数以及涉及的驱动文件列表。BlueScreenView还有一个很贴心的地方它会把崩溃时内存里的驱动列表用不同颜色标出来红色通常表示位于调用栈中的模块也就是嫌疑人绿色表示普通的已加载驱动。你可以一眼看到哪个驱动文件多次出现在不同蓝屏记录里重复出现的高频模块基本就是真凶。对普通用户来说BlueScreenView的直观程度远超WinDbg缺点是它不解析深层的堆栈细节遇到复杂的蓝屏你最终还是得回WinDbg。3.3 工具选型对比表对比项WinDbgBlueScreenView上手难度较高极低信息深度深可看堆栈、交互命令浅只列驱动列表符号依赖需要配置符号不需要适合人群有一定基础、想彻底搞清新手快速定位复杂问题分析强弱我的习惯是先用BlueScreenView扫一遍所有蓝屏记录看看规律如果发现明显的高频驱动直接针对那个驱动处理如果看不出来再上WinDbg解析单个文件。4. 实战分析拿到dmp文件后的完整操作流程4.1 用WinDbg加载Minidump文件我拿一个真实案例演示。有一次朋友的电脑频繁蓝屏错误提示一闪而过重新开机后一切正常但隔两天又蓝一次。我先让他确认C:\Windows\Minidump目录下有没有文件结果有一堆最新的叫Mini052823-01.dmp。用WinDbg打开这个文件界面一上来会显示文件的基本信息包括版本、时间戳。然后我在命令窗口输入!analyze -v。注意这里有个细节第一次执行时要等符号加载进度条可能在下方状态栏转很久这是正常的。如果符号加载失败后面第六节专门讲。4.2 读懂关键输出BugCheck代码与参数!analyze -v的输出很长跟着看几行关键的BugCheck 1E, {C0000005, FFFFF800042B6D6E, 0, FFFFFFFFFFFFFFFF} Probably caused by : dxgmms2.sys ( dxgmms22f8790 )BugCheck 1E是KMODE_EXCEPTION_NOT_HANDLED意思是内核态代码执行时抛出了一个未被处理的异常。第一个参数C0000005是访问违例Access Violation基本就是代码试图访问不允许访问的内存地址。第二行直接给出了dxgmms2.sys这是显卡驱动图形内核相关的模块。看到这个结果排查方向就非常明确了检查显卡驱动版本、清洁安装最新版驱动、或者回滚到稳定版。再往后输出里还有一段STACK_TEXT记录崩溃前的堆栈调用链。你会看到类似这样的结构nt!KeBugCheckEx dxgkrnl!... dxgmms2!...堆栈里连续出现dxgkrnl和dxgmms2证实了问题发生在DirectX图形子系统里。整个分析过程大概三分钟就锁定了显卡驱动这一模块。后来验证那台机器用的显卡驱动确实是从某驱动管理软件安装的通用版本换成芯片厂商官方最新版后一个月内没再蓝屏。4.3 定位问题驱动lmvm命令的进阶用法当你看到模块名后下一步要确认这个模块到底是哪个软件带来的。在命令窗口输入lmvm dxgmms2会显示该模块的路径。如果路径显示Image path: \SystemRoot\System32\drivers\dxgmms2.sys Image name: dxgmms2.sys这说明文件属于系统目录是系统自带的DirectX图形内核模块真正的厂商文件大概率是被它调用的显卡驱动。这种情况下还要继续看崩溃时栈里的其他第三方模块名。如果你发现崩溃模块指向一个不认识的.sys文件比如某个软件安装后塞进System32\drivers目录的驱动直接拿文件路径去搜索就能找到对应的软件厂商。搜索时优先看文件属性里的公司和文件版本字段很多驱动在文件属性里写得很清楚。4.4 用命令快速检查驱动时间戳补充几个常用命令vertarget显示系统版本和构建号!drivers列出所有内核驱动列表和驱动签名时间。在解决哪个驱动导致蓝屏时我很喜欢用!drivers命令。它会列出所有内核驱动包括加载地址、时间戳、驱动名。如果一个驱动的时间戳比系统安装时间还晚说明刚装不久那它参与蓝屏的嫌疑就大幅增加。时间不对、版本太老、驱动来源不明这三个标签叠加基本就是排查的重中之重。5. 高频蓝屏错误代码速查与实用排查路径5.1 常见错误代码对照表蓝屏代码非常多但日常高频出现的也就十几个。我把最常见的情况整理成了一张速查表方便遇到问题直接对照BugCheck代码错误名称常见原因优先排查方向0x0000000AIRQL_NOT_LESS_OR_EQUAL驱动访问了不正确的内存地址更新或重装最近安装的驱动0x0000001EKMODE_EXCEPTION_NOT_HANDLED内核程序异常未被处理检查崩溃模块对应的驱动/软件0x00000024NTFS_FILE_SYSTEM文件系统驱动出错常伴随磁盘故障运行chkdsk、检查SSD健康状态0x0000003BSYSTEM_SERVICE_EXCEPTION系统服务异常频繁与显卡驱动相关更新显卡驱动0x00000050PAGE_FAULT_IN_NONPAGED_AREA引用了无效的内存地址内存测试、驱动更新0x0000007AKERNEL_DATA_INPAGE_ERROR内核无法从磁盘读入数据磁盘坏道、内存问题0x0000007BINACCESSIBLE_BOOT_DEVICE无法访问启动设备硬盘故障、启动配置0x000000D1DRIVER_IRQL_NOT_LESS_OR_EQUAL驱动在错误的IRQL上操作内存最新驱动冲突排查0x000000EFCRITICAL_PROCESS_DIED关键系统进程意外退出系统文件检查、内存测试0x00000116VIDEO_TDR_FAILURE显卡驱动超时无响应显卡驱动、散热、硬件0xC000021ASTATUS_SYSTEM_PROCESS_TERMINATED关键系统进程终止系统修复、更新回滚这张表覆盖了很多人搜索的kernel data inpage error蓝屏ntfsfilesystem蓝屏0xc000021a蓝屏等场景。遇到这些代码先按表格方向排查再去深挖dmp细节效率会高很多。5.2 从错误代码到解决方案的排查路径以0x00000024为例说明排查路径。这个代码意味着NTFS文件系统驱动在读写时出了严重问题。拿到这个代码不要急着重装系统先去查磁盘健康状态。我习惯先用CrystalDiskInfo看硬盘SMART信息如果看到C5待重映射扇区计数或C6无法修正的错误扇区计数有值那基本就是硬盘有坏道了。然后跑一遍chkdsk /f /r看能不能修复同时建议立刻备份重要数据。如果硬盘健康再考虑驱动层面。查一下最近是否装过磁盘加密软件、虚拟磁盘工具或者更新过存储控制器驱动。有一类蓝屏是由npcap这类网络抓包驱动引发的情况比较特殊。npcap经常随Wireshark一起安装它的驱动在拨号上网时偶尔会触发蓝屏。在dmp里会看到npcap.sys出现在堆栈中这种直接卸载npcap即可换用最新版或者改用别的抓包方案。5.3 复杂案例BitLocker、安全启动与显卡驱动的连环坑搜索热词里有一个频繁出现的场景是红米笔记本bitlocker蓝屏。这类蓝屏的典型特征是启动时进入BitLocker恢复界面提示输入恢复密钥甚至直接蓝屏。原因往往不是BitLocker本身坏了而是开机引导链发生了变化比如BIOS里安全启动被关闭、硬盘模式被改成不同协议模式导致系统无法正常校验启动链。解决思路是去BIOS里重新开启安全启动并确保启动模式与磁盘上的系统安装方式一致。这里提醒一句动手改BIOS之前务必先备份BitLocker恢复密钥去微软账户的密钥管理页面可以查到。没有密钥就乱动BIOS可能会遇到比蓝屏更麻烦的数据恢复问题。显卡驱动相关的蓝屏同样常见。dxgmms2.sys是DirectX图形内核模块很多游戏闪退、偶发蓝屏都与它有关。遇到dxgmms2.sys的蓝屏第一件事就是彻底卸载当前显卡驱动用DDU在安全模式下把显卡驱动清干净再装官方驱动。顺便检查显卡温度尤其是夏天高温导致显卡驱动超时的情况也不少。说到win32k.sys蓝屏这个模块是Windows内核的图形窗口管理模块如果dmp里多次出现它且堆栈指向第三方输入法、远程控制软件或桌面美化工具优先排查这些应用的内核钩子。6. 常见问题与排查技巧实录6.1 找不到Minidump文件怎么办这是我在帮人排查时碰到最多的情况。蓝屏后打开C:\Windows\Minidump目录不存在或空无一物。先查三处第一确认系统属性里的写入调试信息是否关闭第二确认C盘页面文件是否开启Minidump的写入依赖页面文件临时存储第三查看C:\Windows\MEMORY.DMP是否存在如果系统配置了其他转储类型文件可能写在根目录。还有一类情况是系统能正常开机但事件查看器里有关于系统已在未先正常关机的情况下重新启动的记录。这时候去事件查看器的Windows日志-系统里筛选来源Kernel-Power和BugCheck能看到蓝屏发生的时间点和错误代码。在WinX菜单里选择事件查看器左侧展开Windows日志点系统右侧点筛选当前日志来源里勾选Kernel-Power和BugCheck即可。虽然是间接信息但总比没有强。6.2 WinDbg符号加载失败怎么办符号加载失败是WinDbg新手最容易卡住的环节。症状是执行!analyze -v后输出一堆无法找到符号文件的提示或者模块名显示为问号。网上很多老教程教人手动下载符号包其实现在主流做法是直接用微软符号服务器自动下载。如果自动下载失败优先检查网络到微软服务器是否通畅公司内网是否拦截代理配置是否正确。WinDbg的设置里可以单独配置代理。还有一种情况是符号缓存目录没有写权限确保你填写的缓存路径真实存在且用户有写入权限。最后实在不行把符号路径清空再次执行分析虽然拿不到完整符号但WinDbg依然能根据导出表给出模块名至少能定位是哪个.sys在堆栈里。6.3 我的独家排查心得做蓝屏排查这几年我自己总结了一套优先级判断规则分享出来供参考。第一永远先看驱动。Windows蓝屏有超过八成与驱动相关无论是过时的显卡驱动、杀毒软件的自我保护驱动还是外设厂商的配套工具都是头号嫌犯。在dmp里看到第三方.sys先搜它属于哪个软件。第二关注蓝屏频率和触发场景。如果蓝屏只发生在休眠唤醒后重点查电源管理相关驱动如果只发生在游戏运行时显卡和声卡驱动优先如果开机一段时间后随机蓝屏考虑内存和温度。第三频繁蓝屏但dmp分析不出来时建议用Windows内存诊断工具跑一遍内存测试再用CrystalDiskInfo检查硬盘。硬件问题里内存条接触不良、超频不稳定、SSD固件bug都容易伪装成驱动问题。第四记录蓝屏时间点。把每次蓝屏的时间记下来对比你安装软件、更新驱动的历史往往能揪出自更新类的软件。很多应用在后台悄悄更新驱动第二天就蓝屏时间线一对照立刻就清楚了。第五也是最容易被忽略的Windows更新本身也会带来蓝屏。某些补丁与特定硬件或驱动不兼容会引发系统服务异常甚至0xC000021A这种关键进程终止的蓝屏。此时在dmp里未必能直接看到凶手但按照蓝屏时间查Windows更新记录卸载最近的更新往往立竿见影。我个人在实际排查中的体会是这套流程真正值钱的地方不是某个单一命令而是把留证—读证—排查—验证串成一条线。第一次用WinDbg的时候我也被满屏十六进制淹没过但只要你坚持把每个蓝屏都当成一个需要还原的现场从Minidump里找出那个反复出现的.sys文件用不了多久你就会发现在修电脑这件事上你已经从猜变成了查。
返回列表