崩溃时产生的dump文件,VC++ 怎么定位问题并进行调试

一、什么是PDB文件

       1. PDB文件是"程序数据库" Program Data Base的简称,包含的程序的代码信息

       2.通过这个文件我们可以查看对应断电的位置,堆栈信息等内容

       3.使用PDB使得我们无需代码也可以掌握程序的堆栈运行状态

二、PDB文件

       1.由链接器自动生成

       2.文件由两部分构成,私有符号数据(private symbol data )和 公共符号表(public symbol data)

          私有符号数据(Private Symbol Data)

          函数

    全局变量

    局部变量

    用户定义的结构体,类,数据类型

    源文件的名称和源文件中每个二进制指令的行号

   公共符号表(Public Symbol Table)

    静态变量

    全局变量(external)
三、如何得到PDB文件

       程序编译之后会在Debug或者是Release目录下生成*.pdb文件

四、什么是dump文件

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

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

  当程序遇到未处理异常(主要指非指针造成)导致程序崩溃死,如果在异常发生之前调用了SetUnhandledExceptionFilter()函数,异常交给函数处理。

       MSDN中描述为:

  Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.

  因而,在程序开始处增加SetUnhandledExceptionFilter()函数,并在函数中利用适当的方法生成Dump文件,即可实现需要的功能。

  Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。

五、EXE、DLL等与pdb文件的匹配

       调试器是如何来判别EXE、DLL等是否和一个pdb文件匹配呢?

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

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

六、编译器产生符号的过程

        如果指定生成调试信息,编译器在每次编译完文件以后就会产生一个obj文件,然后同时产生它对应的调试信息。当我们进行连接的时候,编译器就会帮我们把所有obj统一编译为一个可执行文件,然后所有的调试信息统一生成一个PDB文件。

七、Release程序生成pdb文件

       用VS调试Release的程序,发现无法调试。其实,并不是Release的程序不能调试,而是没有让Release的程序生成pdb文件,VS无法加载pdb文件而无法调试程序。

      设置一下,让Release的程序也生成pdb文件,就好了。

     

八、本地dump调试

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

    

    

十、无源代码dump调试

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

  (1)当把pdb文件与dmp文件放入同一目录下时,就不需设置其路径,否则需要设置

    工具->选项->调试->符号:

            

   

  (2)还需设置源代码路径:

    属性->调试源代码:

            

  这样点击“使用仅限本机进行调试”,即可在出错代码行中断:

     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  

   可以得出详细的异常分析
      

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows调试是一种通过分析崩溃生成的dump文件来定位错误和问题的过程。dump文件是操作系统在程序崩溃自动创建的一种保存程序状态和信息的文件。 通过dump文件定位崩溃的过程可以分为以下几个步骤: 1. 获取dump文件:当程序崩溃,操作系统会自动创建一个dump文件,通常保存在程序的运行目录下。可以通过查看程序崩溃的错误提示信息来确定dump文件位置。 2. 安装符号文件:符号文件是包含程序源代码和编译器产生调试信息的文件。在调试过程中,需要将符号文件dump文件关联起来,以便能够查看和分析源代码。可以从官方网站下载对应版本的符号文件。 3. 打开dump文件:可以使用调试工具(如Visual Studio、WinDbg等)打开dump文件。在打开文件后,工具会载符号文件,显示出崩溃堆栈信息。 4. 分析堆栈信息:堆栈信息显示了程序在崩溃函数调用情况。从堆栈信息中,可以定位到导致崩溃函数和代码所在的位置。通过查看源代码,可以进一步分析和解决错误。 5. 调试程序:在分析崩溃原因后,可以使用调试工具来逐步执行程序,观察变量的值和执行的过程,以便定位错误。可以设置断点、观察变量、修改变量的值等操作,帮助分析和解决问题。 通过以上步骤,我们可以利用dump文件进行Windows调试,快速定位程序崩溃的原因,并解决问题。调试过程需要了解一定的调试技巧和工具的使用方法,同对于程序的结构和运行过程有一定的了解,这样才能更好地定位和解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值