Window环境下的C++程序如果发生异常崩溃,首先会和客户联系,让帮忙取特定目录下的dump文件和log文件来分析崩溃的原因。不过发生崩溃的话,从log一般分析不出特定原因,这时候dump文件就起作用了。可以通过Visual Studio和Windbg来静态分析dump文件,定位发生异常的位置和调查可能的原因。
文章将介绍如何使用Visual Studio工具进行C++ 静态dump文件的分析。
把dump文件拖进Visual Studio即可
点击【仅限本机进行调试】,启动dump(托管工程可以选择【仅限托管】或者【混合】)
调试启动后,如果dump文件和pdb文件在同一个目录的,可以直接定位到异常代码行。
调试启动后,如果dump文件和pdb文件不在同一个目录,会显示找不到pdb文件,则需要通过【新建路径】设置pdb文件的路径,然后点击【加载】,就可以定位到异常代码行了。或者把pdb重新放到和程序模块一个目录下,再从第一步开始。
实际调试中,最终崩溃的地方往往发生在系统dll中。因为对于系统dll,我们没有对应的pdb,并且也不大可能是系统dll造成的异常,所以需要根据调用堆栈去查看是我们自己的哪个模块调用了系统函数。在没有设置自己程序的pdb时,如图是看不到详细调用堆栈的。
根据实际情况,把有可能发生问题的模块的pdb文件放入和dump同一目录,重新进行调试。
如图,pdb文件加载后,就可以看到发生崩溃时自己程序的调用堆栈了,并且具体到了函数和行数。双击调用堆栈那里的函数(蓝色遮盖区域),可以打开cpp并查看发生问题地方的上下文,并检查内存的变量值。(如果没有自动打开代码,只需按照提示设置正确的代码路径即可)