如何使用Windbg分析崩溃dump

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Windbg分析崩溃dump相关的知识,希望对你有一定的参考价值。

需要为Windbg软件设置符号表路径,作为蓝屏原因分析数据库,否则软件将没有作用。单击File--选择Symbol File Path,在弹出的对话框Symbol Path文本框中输入SRV*C:\\Symbols*http://msdl.microsoft.com/download/symbols,单击OK。

设置完毕后单击File--选择Open Crash Dump来打开蓝屏文件,在弹出的对话框中点选到C:\\Windows\\Minidump文件夹,单击我们要分析的蓝屏文件,单击打开。

在弹出的对话框Save Information for workspace?(是否保存信息到工作区)中单击Yes。(如果下次不想再被提示,可以勾选Don't ask again in the WinDbg session)。

接下来就是对文件进行分析,这需要一定的经验和知识。这里我们着重可以看一下System Uptime(开机时间)和Probably Caused By(可能引起故障的原因是)。

需要进一步分析,可以单击!analyze -v,此时我们可以从中提取到蓝屏错误代码和引起蓝屏的程序名称,再通过网络搜索这些程序名和代码等方式弄清原因。

参考技术A 右击“计算机”-“属性”-“高级系统设置”-“高级”-“启动和故障恢复”设置
2.提取蓝屏文件"C:WINDOWSMinidump"dump文件及"C:WINDOWS"MEMERY.DUMP
3.下载安装windbg
4.启动"windbg"-点击"File"-"OpenCrashDump"-选择dump文件
5.找到"probablycausedby"字样确定罪魁祸首
6.一些信息DEFAULT_BUCKET_ID:DRIVER_FAULT//指出错误类型,这里是驱动错误
BUGCHECK_STR:0xD1//bugcheck索引,可查windbg文档,也可"!analyze?showD1"
PROCESS_NAME:NotMyfault.exe//错误所属进程
附:windbg基本调试命令:
r可以显示系统崩溃时的寄存器,和最后的命令状态。
dd显示当前内存地址,dd参数:显示参数处的内存。
u可以显示反汇编的指令
!analyze-...本回答被提问者和网友采纳
参考技术B 调试Dump文件很简单,双击自动打开VC然后F7运行。
但是中间要注意很多事情。

1。Dump文件放在哪里

Dump文件不用非要放在你编译出来的位置,你完全可以建立一个新的文件夹来放它。

2。要恢复当时的现场

可能你要问,怎么可能,这个dump文件可是用户发给我的,我不可能去用户家里调试吧?
这个恢复现场可不是指的非要到那台机器上去,而是要把产生dump文件对应的二进制文件拿到。

但是恢复现场需要所有的二进制文件都要对应,你一定要有导致用户崩溃的那些Exe和Dll。既然是你发布的程序,Exe文件当然你会有。所以这里只考虑Dll就行了。
Dump文件中记录了所有dll文件的版本号和时间戳,所以你一定可以同过某种途径拿到它。如果你能从用户那里拿到最好,如果不方便,用户不可能用的是我们平常不常用的操作系统,所以找个有对应系统的机器一般都会有。但是记住不光是文件名称要一致,还要核对版本和时间戳,如果不同一样没有办法用。

使用windbg分析iis崩溃的一个实例

问题背景说明:客户的生产环境不定时发生崩溃,需要定位崩溃的原因。在开发环境不能重现该问题,准备抓取IIS的dump文件分析

第一步:在客户的生产环境抓取dump文件

参考:IIS崩溃时自动抓取Dump

等IIS崩溃时,会自动转存dump文件

 

第二步:分析dump文件

2.1  选择在那个环境分析dump文件

一般可以选择在生产环境分析dump文件,(如果开发环境有符号表文件,也可以把dump文件拷贝到开发环境分析)

2.2 安装windbg

参考:wndbg下载与安装

2.2 选择dump文件

 

2.3 设置符号服务器与符号缓存

.symfix d:\\symbols

符号服务器:在调试过程中,需要涉及成千上万个符号文件,以及同一个符号文件存在不同平台下的不同符号文件版本的时候。一一手动设置符号路径肯定是不现实的,于是引入了符号服务器的概念。符号服务器有一套命名规则,使得调试软件能够正确找到需要的符号文件。一般来说,符号服务器比较大,都是共用的,放在远程主机上。为了降低网络访问的成本,又引入了符号缓存的概念,即将从服务器上下载到的符号文件,保存在本地缓存中,以后调试器需要符号文件的时候,先从缓存中寻找,找不到的时候再到服务器上下载。

 这是一台微软对外公开的服务器,使用http地址访问,不是所有人都能牢记这个网址,所以最好的办法就是使用.symfix命令(自动记忆了上面那个微软符号服务器地址),语法如下:

.symfix [+] [符号缓存地址]

 

2.4 加载sos

.loadby sos clr

 

2.5 分析异常

!pe

能看出来是堆栈溢出异常,接下来我们看看堆栈

!dumpstack

能看出来死循环

接下来要看一下堆栈头部,看看是什么对象什么参数下会发生死循环

如果要查看更详细的对象,可以用下面的命令

!dso 列出所有对象【DumpStackObjects

!do 查看对象【DumpObj

如果手上没有源码,需要分析组件的代码

!dumpheap -mt methodTable 查看方法表
!savemodule module d:\\xxx.dll

保存一个dll组件,用ilspy反编译看一下源代码

 sos命令参考:http://blog.csdn.net/puncha/article/details/11953723

 

以上是关于如何使用Windbg分析崩溃dump的主要内容,如果未能解决你的问题,请参考以下文章

WinDBG相关

C++异常分析使用windbg分析dump文件,排查模态框返回时的崩溃问题

如何抓取windows的dump?抓取dump

使用WinDbg分析蓝屏dump原因

windbg 和cdbg使用总结

调试技巧 —— 如何利用windbg + dump + map分析程序异常