Win10驱动引发BSOD时如何将日志写入崩溃转储供!dbgprint读取
DbgPrint日志未写入崩溃转储的解决方案
问题根因
DbgPrint/DbgPrintEx输出的日志默认存储在内核的环形调试缓冲区中,Win10默认配置下,该缓冲区不会被纳入「小内存转储」「内核内存转储」,且默认缓冲区容量极小,容易被新日志覆盖,最终导致转储中无法读取到对应日志。
修复DbgPrint写入转储的方案
- 调整系统转储类型为完整内存转储:进入「控制面板>系统和安全>系统>高级系统设置>启动和故障恢复>设置」,将「写入调试信息」选项修改为「完全内存转储」,需要预留与物理内存大小相同的磁盘空间用于存储转储文件。
- 扩大DbgPrint内核缓冲区容量:打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,新建名为Debug Print Buffer的项,在该项下新建DWORD类型值BufferSize,赋值为0x100000(即1MB,可根据需求调整容量),重启设备生效。 - 开启对应等级的日志输出过滤:定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,新建名为Debug Print Filter的项,在该项下新建DWORD类型值IHVDRIVER,赋值为0xF,允许所有等级的IHV驱动日志写入缓冲区,重启设备生效。 - 验证日志输出有效性:可使用DebugView工具开启内核日志捕获,确认你编写的DbgPrint日志正常输出,排除代码逻辑问题导致的日志丢失。
替代日志方案(无需完整内存转储)
如果测试环境无法配置完整内存转储,可选用以下更稳定的内核态日志方案:
- WPP软件追踪:Windows原生提供的轻量级内核日志方案,日志写入系统追踪缓冲区,默认会被纳入内核转储甚至小内存转储中,Windbg中执行
!wpptrace命令即可解析日志,性能开销远低于DbgPrint,支持自定义日志格式与参数。 - 自定义非分页缓冲区日志:驱动初始化时申请一块固定大小的非分页内存作为私有日志缓冲区,每次输出日志直接写入该内存区域,崩溃时这块内存会被保留在转储中,可在Windbg中直接读取内存地址解析日志,可在缓冲区头部添加固定魔数方便快速定位日志块。
- 系统错误日志上报:使用
IoWriteErrorLogEntry系列API将关键异常信息写入系统事件日志,即使未捕获到转储文件,也可以在测试机的事件查看器中查询到对应的错误记录,适合关键故障的回溯。
内容的提问来源于stack exchange,提问作者user3124812
相关产品推荐
相关产品推荐

