Skip to the content.

Windows 蓝屏 dump 分析

[!NOTE] 参考神奇海螺的意见,有待验证

用 cdb.exe(WinDbg 的命令行版本)无人值守地分析一个内核 dump 的模板命令, 以及用它定位到的一个 0x9F 实例。

分析命令

"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -z C:\Users\97936\090926-5687-01.dmp -y srv*C:\symbols*https://msdl.microsoft.com/download/symbols -c "!analyze -v; !devstack ffffbc8f9611e750; !devobj ffffbc8f9611e750; !irp ffffbc8f96a42a60; q"

命令行参数

部分 含义
cdb.exe Console Debugger,WinDbg 的命令行版本(同一套引擎,无 GUI),适合脚本/CI 批量分析
-z <dump> 打开一个已存在的 dump 文件作为调试目标(不是启动进程)。示例中的文件名是 Windows 蓝屏 dump 的典型命名 YYMMDD-序号-序号.dmp,即 09 年 09 月 26 日生成
-y <sympath> 符号路径。三段用 * 分隔,是 WinDbg 的「符号服务器」语法:第 1 段空 = 默认本地缓存目录;第 2 段 C:\symbols = 本地缓存位置(下载过的 PDB 存这里,下次离线可用);第 3 段 https://msdl.microsoft.com/download/symbols = 微软公共符号服务器
-c "<cmds>" 启动时立即执行引号里的命令串,分号分隔;执行完继续会话(所以末尾要有 q)

-c 中的调试命令

整体流程

ffff... 开头是 x64 内核态虚拟地址,说明这是内核 dump。整条命令的顺序是:

  1. 加载 dump 并拉取符号;
  2. !analyze -v 给出崩溃概览,并从输出里定位可疑的设备对象/IRP 地址;
  3. 用 !devobj / !devstack 看该设备对象的层次结构、哪个驱动拥有它;
  4. 用 !irp 看当时正在下发/挂起的 IO 请求走到了哪一层;
  5. 退出。

典型场景:某驱动(存储/过滤/杀软/加密驱动)在 IO 路径上崩了,通过「设备栈 + 当前 IRP 栈位置」确定是自研驱动还是第三方过滤驱动的问题。

注意事项

案例:0x9F,UsbHub3 电源 IRP 卡死(090926-5687-01.dmp)

!analyze -v 结论

设备栈:!devstack ffffbc8f9611e750

  !DevObj           !DrvObj            !DevExt           ObjectName
  ffffbc8f96b05410  \Driver\HidUsb     ...
> ffffbc8f9611e750  \Driver\USBHUB3    ffffbc8f96a45da0  ...
!DevNode ffffbc8f96b05010 :
  DeviceInst is "USB\VID_0627&PID_0001\68284-0000:00:0d.0-2"
  ServiceName is "HidUsb"
Device object (ffffbc8f9611e750) is for:
 \Driver\USBHUB3 DriverObject ffffbc8f9603b6c0
AttachedDevice (Upper) ffffbc8f96b05410 \Driver\HidUsb

IRP 栈:!irp ffffbc8f96a42a60

节选,> 为当前栈位置:

Irp is active with 16 stacks 12 is current (= 0xffffbc8f96a42e48)
>[IRP_MJ_POWER(16), IRP_MN_SET_POWER(2)]
    0 e1 ffffbc8f9611e750 00000000 fffff80311e1c910-ffffbc8f961ba0d0 Success Error Cancel pending
       \Driver\USBHUB3  UsbHub3!HUBPDO_WdmPnpPowerIrpCompletionRoutineForAsynchronousCompletion
        Args: 00000000 00000001 00000001 00000000
 [IRP_MJ_POWER(16), IRP_MN_SET_POWER(2)]
    0 e0 ffffbc8f9611e750 00000000 fffff80311ee1d50-00000000 Success Error Cancel
       \Driver\USBHUB3  hidusb!HumPowerCompletion
 [IRP_MJ_POWER(16), IRP_MN_SET_POWER(2)]
    0 e0 ffffbc8f96b05410 00000000 fffff8037ba124f0-ffffbc8f96a422c8 Success Error Cancel
       \Driver\HidUsb  HIDCLASS!HidpFdoPowerCompletion
 [IRP_MJ_POWER(16), IRP_MN_SET_POWER(2)]
    0 e1 ffffbc8f96b05410 00000000 fffff8037ba124f0-ffffbc8f96a422c8 Success Error Cancel pending
       \Driver\HidUsb  nt!PopRequestCompletion

解读

被卡设备是 QEMU usb-kbd

解决办法

替换为 virtio-keyboard

参考

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。