如何通过dump文件定位崩溃,解决问题

发布时间 2023-08-11 14:25:35作者: 一杯清酒邀明月

1、dump文件是附加堆栈信息的存储文件的简称,文件扩展名“.dmp”,通过dump文件我们可以得到程序运行某一时刻的堆栈数据。

2、当程序意外崩溃后,通常程序会立即中断运行,拿到这一时刻的dump文件就可以通过此时的堆栈进行分析,找到崩溃的代码并分析原因。

3、当程序遇到未处理异常(主要指非指针造成)导致程序崩溃,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。

4、调试器是如何来判别EXE、DLL等是否和一个pdb文件匹配呢? 每次我们链接EXE或者DLL或者SYS的时候,链接器都将产生一个唯一的GUID,然后将其写入到PDB和可执行文件。调试器加载的时候将检查两者的GUID,如果一致就表示他们匹配。

5、注:如果我们需要调试,我们需要查dmp文件,那么请妥善保管好自己的代码和pdb。每次重新编译,即使所有代码均没有变化,他们的GUID也不同。

6、用VS调试Release的程序,发现无法调试。其实,并不是Release的程序不能调试,而是没有让Release的程序生成pdb文件,VS无法加载pdb文件而无法调试程序。链接器-调试-生成调试信息设置一下就可以调试了。

7、本地dump调试:直接用VS打开XX.dmp文件,测试时dmp文件是本地产生的,因此VS会依据dmp文件自行找到exe,pdb和源代码的路径。因此直接点击调试,程序会出错代码行中断。

8、无源代码dump调试:若dmp文件是exe在另一台机器上产生的,则我们最好把exe,pdb,dmp放到同一文件夹下,必须保证pdb与出问题的exe是同一时间生成的,用VS打开dmp文件后还需要设置符号表文件路径和源代码路径。工具-选项-调试-符号。

9、调试dump文件时需要保证dump文件和exe、dll版本一致。只要是dump文件不是这个exe产生的,不管源代码是不是一样,结果都会提示找不到exe。

10、WinDbg调试:基本思路与VS一致,winDbg会提供更为全面的调试信息。

  (1)设置pdb路径:File ->Symbol File Path

  (2)设置exe路径:File -> Image File Path

  (3)设置源代码路径:File -> Source File Path(指sln所在目录)

  (4)打开dmp文件:File ->Open Crash Dump

  (5)执行命令 !analyze –v