实战经验:记录一次蓝屏崩溃诊断经历
在一次系统调试期间,虚拟机中的Win7突然蓝屏。为了找到导致蓝屏的原因,我开始了如下的诊断过程。
1) 打开事件查看器
开始->运行,输入eventvwr.msc,即可快速打开系统的事件查看器。展开左侧Windows日志结点,可以看到<系统>结点。右键<系统>结点,选择<筛选当前日志>,然后事件级别下方勾选关键,警告,错误,点击确定后,即可筛选出错误级别的系统日志信息,而过滤掉大量的普通信息。如下图所示:
2) 找到BugCheck事件条目
在筛选出的系统错误日志中,可以在来源这一列看到最新的BugCheck条目,这个条目包含有系统蓝屏记录的错误代码及崩溃转储文件信息。如下图所示:
双击该条目,可以查看蓝屏详细信息,如下图所示:
3) 我们从蓝屏详细信息中看到,崩溃错误代码为 0x0000008e (0x80000004, 0xffdff2a5, 0x95b69d48, 0x00000000)。但是,仅仅知道崩溃错误代码,还是不足以定位蓝屏的具体原因。这个时候,系统生成的崩溃转储就起作用了。系统会生成两种类型的转储文件,一个是完全转储,文件名为C:\Windows\MEMORY.DMP,一个是最小转储,文件名位于C:\Windows\Minidump目录下。
4) 设定WinDbg符号路径
WinDbg在调试的时候,需要找到与Dll文件对应的符号文件,这样才能显示更多的信息,比如特别有用的调用堆栈。我们在载入崩溃转储文件之前,需要设定符号文件的路径,这样,如果系统dll中出问题,我们就可以从符号文件中定位出问题堆栈。打开WinDbg,选择Symbol Search Path, 输入SRV*c:\dbg_symbol*http://msdl.microsoft.com/download/symbols,点击确定保存。此设定的含义是,从站点http://msdl.microsoft.com/download/symbols下载调试所需要的符号文件,并保存至本地路径c:\dbg_symbol下。
5) 使用WinDbg调试崩溃转储
拷贝转储文件到桌面,然后打开WinDbg,选择File->Open Crash Dump,选择拷贝出来的转储文件,并点击确定。WinDbg会自动加载转储文件,并显示崩溃概要信息:
如需要查看崩溃的详细信息,可以在下方输入栏输入:!analyze -v,这时,WinDbg会尝试显示系统崩溃时的各个寄存器信息及调用堆栈等。如下图所示:
6) 确定崩溃原因
从上图中的崩溃信息中,我们可以看到PROCESS_NAME一栏的值为dbgview.exe。说明导致蓝屏的进程为dbgview进程。这里需要说明一下这个dbgview,它是Windows下查看调试输出的有力工具,不仅可以查看应用程序的调试信息输出,也可以查看内核驱动的调试信息。另外,启用内核调试信息输出时,dbgview会尝试加载Dbgv.sys驱动,所以,如果需要查看内核调试信息,需要以管理员权限打开dbgview。
下图显示了启用了内核调试输出的Dbgview界面:
下图显示了未启用内核调试输出的Dbgview界面:
至此,我们可以基本确定是dbgview的内核调试信息模块Dbgv.sys与VMware虚拟机系统交互上出了问题,导致了此次系统蓝屏。
结论:作为开发人员,如果不涉及驱动程序开发,仅仅开发普通应用程序的话,其实没有必要启用dbgview的内核调试信息输出。关闭dbgview的内核调试信息,既可以保持系统的稳定,也同样可以观察应用程序的调试输出。
- 下一篇: 代码片段:获取系统所有IP
- 上一篇: 实战经验:时刻关注类对象内部数据成员状态
相关推荐
- C++代码扫描基础知识
- Posted on 07月10日
- 一种编写回调函数的简单方法
- Posted on 07月28日
- 实战经验:记录一次蓝屏崩溃诊断经历
- Posted on 11月05日
- 关于位图画刷的其他两种用法
- Posted on 05月29日
评论已关闭。