Window环境下的C++程序如果发生异常崩溃,首先会和客户联系,让帮忙取特定目录下的dump文件和log文件来分析崩溃的原因。不过发生崩溃的话,从log一般分析不出特定原因,这时候dump文件就起作用了。可以通过Visual Studio和WinDbg来静态分析dump文件,定位发生异常的位置和调查可能的原因。
在本篇文章中,我们将介绍如何使用WinDbg工具来分析C++程序的dump文件。
1. 打开dump文件
首先,我们需要打开要分析的dump文件。在WinDbg中,选择File->Open Crash Dump,然后选择要打开的dump文件的路径。或者直接把dump文件拖进到WinDbg中。
2.查看异常上下文
打开dump文件后,输入.ecxr命令。
当系统发生异常时,异常处理器会记录下当前的上下文环境,并将此信息存储在这个寄存器中。通过这个命令可以查看这个寄存器的内容。还需配合其他命令,如kn/kv/kp等,进一步查看函数调用堆栈和相关变量内容,以帮助定位和解决问题。
3.查看函数调用堆栈
.ecxr命令后,接着输入kn/kv/kp命令,可以查看崩溃发生时的函数调用堆栈。但是还不能具体到函数名和行号。
如图,最终崩溃的地方虽然是系统dll,但是不可能是系统函数的原因,根据函数调用关系,应该查找我们自己程序调用系统函数的地方。到这里只能定位到是哪一个模块调用了系统函数(黑色遮盖区域)。
4.加载pdb文件
确定是哪一个模块发生异常后,找到和这个模块对应的pdb文件(根据模块生成的时间戳来确定,必须时间一致,否则pdb文件加载可能失败)。选择File->Open Crash Dump,设置pdb文件的目录,记得勾上reload,这样就可以自动去加载pdb文件了。
5.确定崩溃的具体位置
加载pdb文件后,重新输入.ecxr命令,切换到异常的上下文,再输入kn/kv/kp命令,查看函数的调用堆栈。此时可以定位到具体的函数名和行数了。蓝色框遮盖的地方就是调用系统函数的函数名,同时有明确的行数记载(在最右边,截图没有显示)。
补充
本文的截图是开发中的实例,最终崩溃的地方是系统函数,所以需要根据函数调用堆栈去找调用系统函数的模块,然后加载其pdb文件分析。如果崩溃的地方直接是自己的程序模块,直接加载对应的pdb文件就可以了。