1、简介
对于程序崩溃,最快的解决方式是生成Dump文件,通过生成Dump文件使用调试工具进行调试,还原程序崩溃时的状态,能够起到快速定位排查问题的作用。Dump文件是进程的内存镜像,可以把程序的执行状态通过调试器保存到Dump文件中。
2、Dump文件的含义和作用
2.1、Dump文件的类型
Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump。用户模式Dump进一步可以分为完整Dump(Full Dump)和迷你Dump(Mini Dump)。
Dump文件是进程的内存镜像,可以把程序的执行状态通过调试器保存到Dump文件中。
2.2、Dump文件的作用
Dump文件是进程的内存镜像,可以把程序的执行状态通过调试器保存到Dump文件中。在C++编程实践中,通常都会遇到内存访问无效、无效对象、堆栈溢出、空指针调用等常见的C/C++问题,而这些问题最后常会导致系统崩溃。
2.3、Dump文件的生成
2.3.1通过使用任务管理器生成
2.3.2通过编程自动生成
Demo演示[6]。
2.3.3修改注册码生成
3、编程自动生成Dump的原理
3.1、可以预期的异常
在编程过程中,可以预期的异常都通过结构化异常(try/catch)进行了处理。
3.2、未预期的异常
如果发生了未预期的异常,这些异常处理代码无法处理,则转由Windows提供的默认异常处理器来进行处理,这个特殊的异常处理函数为UnhandledExceptionFilter。该函数会显示一个消息框,提示发生了未处理的异常,同时,让用户选择结束或调试该进程。
为了更友好的处理未预期的异常(主要是创建内存转储),可以覆盖默认的异常处理操作。这是通过函数SetUnhandledExceptionFilter完成的,函数原型如下:
4、注意事项
主要是针对编程自动生成Dump的实现。
4.1、pdb文件
程序数据库(Program Database,.pdb)文件(也称为符号文件),在类、方法和其他代码的源文件中创建的标识符映射到在项目的已编译可执行文件中使用的标识符[2][3]。.pdb文件还可以将源代码中的语句映射到可执行文件中的执行指令。调试器使用此信息确定两个关键信息:显示在Visual Studio IDE中的源文件和行号,以及可执行文件中在设置断点时要停止的位置。符号文件还包含源文件的原始位置以及(可选)源服务器的位置(可从中检索源文件)。
在Visual Studio IDE中调试项目时,调试器需要知道查找代码的.pdb和源文件的确切位置。如果要在项目源代码之外调试代码(如项目调用的Windows或第三方代码),则你必须指定.pdb(也可以是外部代码的源文件)的位置,这些文件需要与可执行文件完全匹配。pdb文件主要存储了如下调试信息:
(1)public,private和static函数地址。
(2)全局变量的名称和地址。
(3)参数和局部变量的名称及它们在栈中的偏移量。
(4)类型定义,包括class,structure,和data definitions。
4.2、 exe/dll和pdb一致性问题
调试时,系统会查找exe/dll中指定位置的pdb文件,并且会跟踪exe或者dll中pdb的校验码GUID[5]来对现有的pdb文件进行版本校验。这里需要知道,即使源码没有做任何更改,该pdb文件对应的校验码也是不同的。
4.3、打开dmp文件
双击打开生成的Dump文件,会默认用VS打开并自动创建一个解决方案,Dump摘要信息如下 :
一定要确保进程名称对应的程序路径在本地存在,同时确保最初生成程序的对应.pdb符号文件也在当前目录;
从客户那里反馈回来的Dump文件程序路径和本地的不一致,需要将程序拷贝到Dump信息里面的路径中去;
4.3.1设置 Symbols 路径
调试文件需要对应的符号文件[7], 我们需要设置符号文件对应的路径 :
在Dump信息摘要右上角,点击设置符号路径:
推荐使用Microsoft符号服务器,但第一次在线下载会有点慢;也可以下载符号集文件到某个路径,再将符号路径指向该路径:
4.3.2设置源码路径
在左侧的解决方案处右键点击属性-调试源文件,将源代码的路径添加进来,注意一定是解决方案所在的路径:
4.3.4调试 Dump 文件
准备工作已就绪,现在在Dump文件摘要右上角点击使用 仅限本机 进行调试:
如果提示无法找到调试信息,或者调试信息不匹配,无法查找或打开PDB文件,说明没有将最初生成程序的对应.pdb符号文件放在调试程序所在的目录[方式一]([方式二]路径指定的不正确),或者.pdb符号文件与当前的程序版本不匹配。
5、几个重要的问题
5.1、C/C++ pdb符号文件会不会泄露源码
C/C++程序的反编译。
5.2、发布到生产环境的软件是否需要pdb文件
样例程序
https://gitee.com/beibeix/visual-cplus-plus/tree/master/MiniDumpDemo
参考
- https://blog.csdn.net/lk142500/article/details/80563552
- https://www.cnblogs.com/feihe0755/p/6261938.html
- https://blog.csdn.net/suppercoder/article/details/7672296
- https://www.cnblogs.com/feihe0755/p/6261938.html
- https://baike.baidu.com/item/GUID/3352285?fr=aladdin
- https://blog.csdn.net/qq_20183489/article/details/54090974
- https://www.cnblogs.com/zhanghu52030/p/9341822.html
- c/c++导出动态库