首页Visual Studio › 用vs2008分析dump文件

用vs2008分析dump文件

现场由于条件限制一般不允许安装开发环境,程序崩溃通常无法找到原因。幸好,可通过分析程序崩溃时生成的dump文件来定位错误位置,还原崩溃现场。

  1. 双击minidump文件(*.dmp)。默认会启动vs2008。
  2. 菜单工具→选项→调试→符号,增加PDB文件路径。(minidump文件与pdb文件在同一目录,跳过此步
  3. 若调试的程序需要微软基础库的PDB信息,可以增加一个路径为:http://msdl.microsoft.com/download/symbols如果本地已存储过微软基础库的pdb,跳过此步
  4. 在界面下方“将符号从服务器缓存到此目录”选择本地存储这些符号(Symbols)的路径。

1677309386318877413
设置代码路径:打开dmp工程,右键进入解决方案的属性
4788452303901703235
在这里输入源程序的代码路径。注:一定是sln所在的路径,而不是vcproj的路径!
1660702362692949126

F5调试,定位到崩溃时源代码对应的位置,还原崩溃现场

1881097269457402603

注:请把每次生成的exe(或dll)和pdp以及对应的工程代码文件单独存放,以便于定位错误位置。
 

附:常见问题讨论

1  Dump文件放在哪里

Dump文件不用非要放在你编译出来的位置,你完全可以建立一个新的文件夹来放它。但若不是存放在编译出来的位置,需要将编译生成的PDB文件拷贝到Dump文件目录,或是利用VS2005(2008)打开Dump文件后,设置PDB文件路径。

 

2  如何恢复当时的现场?

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

但是恢复现场需要所有的二进制文件都要对应,你一定要有导致用户崩溃的那些ExeDLL。既然是你发布的程序,Exe文件当然你会有。所以这里只考虑DLL就行了。

Dump文件中记录了所有DLL文件的版本号和时间戳,所以你一定可以同过某种途径拿到它。如果你能从用户那里拿到最好,如果不方便,用户不可能用的是我们平常不常用的操作系统,所以找个有对应系统的机器一般都会有。但是记住不仅是文件名称要一致,还要核对版本和时间戳,如果不同一样没有办法用。

如果客户用了某个特殊的补丁怎么办?

其实这个问题也很好解决,只要它不阻碍阅读堆栈,就不用管它,调试Dump和运行程序不一样,缺少一两个DLL没有任何问题。

 

3  如果真的需要怎么办?

符号文件现在主要是指PDB文件。

如果没有符号文件,那么调试的时候可能导致堆栈错误。

如果你丢失了这个发布版本中你编译出来的那些exe和DLL的PDB,那么这个损失是严重的,重新编译出来的版本是不能使用的。

我自己的DLL都有了,可是缺的是系统的DLL的对应PDB文件怎么办?上图已经介绍了方法。微软在它的符号数据库上为我们提供了所有的PDB文件,还有部分非关键DLL。设置好后程序将自动下载需要的PDB及DLL文件。

 

4  拿到需要的文件了,这些文件应该放在哪里?

符号数据库中的文件不用动,把其它的exe和DLL、PDB文件放在dump文件目录里就行了。

 

5  我用的是VS2005(2008),明明有源代码,为什么显示不了?

这个是dump调试的最头痛问题,代码可能已经改过了,即使你从SVN拿到当时的版本,时间戳也是错的,VS2005(2008)就是不让你显示代码。

其实只要在VS2005(2008)工具选项调试常规 中去掉 “要求源文件与原始版本完全匹配”(Require source files to exactly match the original version) 的复选就行了。

 

发表评论