使用vs2008分析dump

随着工作的需要,需要分析一个wins程序的dump,就不过多的去介绍dump了,它可以看成程序在crash瞬间产生的快照,在其中记录了当前堆栈的调用情况,OK下面介绍如何使用dump,找到程序在crash时函数的调用情况。

本文针对在线上程序crash产生的dump进行说明,本地产生的dump相似;C++程序发布出去时通常会把其产生的dll、pdb给打包发布出去,其中pdb时vs生成的用语调试的符号文件,保存着调试的信息,在Vs的工程属性可以设置(具体如何设置可以自行google一波)成在构建项目时创建PDB文件,一份源代码会产生其对应的dll与pdb信息;要分析dump就必须找到其对应源代码、pdb文件。

当拿到这三个文件后,我们可以用vs打开dump文件(双击即可),然后在vs中,Tools-Options-Debugging-Symbols添加相应的符号文件,这时候就需要我们将拿到的pdb文件路径添加在Symbol file(.pdb) locations:中,下面是我添加的情况:

使用vs2008分析dump

其中第一行微软基础库的pdb信息,如果你在调试过程中不需要的话,可以不用;

OK,这样的话我们就把dump对应的pdb给关联起来了,这样可以找到crash时当前堆栈的信息,但是如果没有源代码的话我们无法看到具体在代码中的位置;这也就是为什么说源代码、pdb、dump缺一不可了。现在我们可以按f5进行调试,这时候我们vs的output中会输出pdb的load信息,直到找到dump中对应的crash位置,这时候vs会弹出很长的Unhandled exception at xxxxxx的对话框,这时候就点击break。

然后就可以在Call Stack中看到相应的堆栈中函数的调用信息啦,虽然其中也显示了具体的类中函数中代码的具体的某一行出了问题,但是我们看不到在具体的工程中这行代码呀,也看不到出问题这行代码的上下文,所以到目前位置我们也无法分析问题,这时候源代码就派上用场了,这时候我们可以点击Call Stack中的工程中函数调用的一行,这时候会跳出相应的对话框让你去选择对应的源文件,然后我们选择源文件中相应的类就可以,最后就把把这个类展示在vs中,并能标记出相应crash的位置,如下图所示:

使用vs2008分析dump

OK,这样我们就可以去分析我们的crash啦~

ps:由于小菜我本来时android开发工程师,工作的需要转开发C++,而最近需要分析wins程序中的出现的dump,所以总结整理出来,如有问题,欢迎吐槽。