C++软件崩溃生成dump信息方案阶段性调研结果

一、软件崩溃生成dump的现有主流跨平台方案

  1. Google Breakpad
    google开发的开源、BSD License类型、支持跨平台的崩溃捕获库。
    官方网址: 官网介绍
  2. Google Crashpad
    google开发的开源、BSD License类型、支持跨平台的崩溃捕获库。
    用于代替Google Breakpad,设计简洁、代码健壮,相比Google Breakpad,主要能支持对Mac OS的进程外崩溃报告。
  3. qBreakpad
    对Google Breakpad的封装,更好适配QT软件,LGPL License类型。

总结: 三种方案均可用于商业软件,而无需开源,方案三对QT软件更适配。

二、基础知识与原理

1、基本概念

dump文件: minidump文件,后缀 *.dmp,是程序崩溃时的内存转储文件;
pdb文件: 后缀 *.pdb,是程序的符号文件

2、原理

我们在编译的时候,需要在Release版程序中生成调试信息。使用Breakpad提供的dump_syms工具,从release版本程序导出符号文件。当程序崩溃时,breakpad会捕捉崩溃,并生成dump文件。dump文件可以直接发送到指定服务器,或者由用户手动发给开发者。开发者收到dump文件后,结合符号文件,可通过minidump_stackwalk工具生成堆栈调用信息文件,这个文件可以直接阅读,定位bug。

3、参考资料

1、中文推荐: Qt Windows系统使用QBreakpad实战
2、官网介绍

三、存在的问题与解决方案

1、Mingw不支持生成pdb文件

证明:

  1. Windows下Qt生成dump文件并定位bug(基于qBreakpad)
  2. Qt如何在Release编译下怎么调试?怎么生成pdb文件?

解决方案:
由于mingw平台下不支持生成pdb文件,所以无法用来调试dump文件,但是我们可以通过cv2pdb来转换,将Mingw编译器对软件的调试信息转换为pdb格式。

实现步骤:
1、 qt mingw 生成DUMP文件,和pdb文件

四、当前方案:

暂定使用方案三测试是否可行。

4.1、Windows平台下方案验证

4.1.1、使用VS编译器进行编译
  1. 编译生成lib静态库
    修正QT版本错误,编译handler生成qBreakpad.lib静态库
  2. Release下崩溃生成dmp文件
    a)编译program链接qBreakpad.lib生成test.exe可执行文件
    b)在可执行文件中增加点击按钮崩溃的功能
    c)点击按钮,出发崩溃钩子,在指定路径生成dmp文件
  3. 生成pdb文件
    增加以下Qmake编译选项,生成test.pdb文件
    QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
    QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
    
  4. pdb与dmp整合定位
    a) 使用VS进行调试
    导入dmp文件,加载pdb符号文件,点击调试,可以获得崩溃位置如下:
    在这里插入图片描述
    b) 使用windbg调试
    有需要再尝试
    c) 使用minidump_stackwalk调试
    有需要再尝试
4.1.2、使用Mingw编译器进行编译
  1. 编译生成lib静态库
    生成了libqBreakpad.a静态库,不符合windows平台下静态库后缀,但可以使用,需要改为cmake测试能否生成qBreakpad.lib
  2. Release下崩溃生成dmp文件
    a)编译program链接libqBreakpad.a生成test.exe可执行文件
    b)在可执行文件中增加点击按钮崩溃的功能
    c)点击按钮,出发崩溃钩子,在指定路径生成dmp文件
  3. 生成pdb文件
    使用cv2pdb64.exe对test.exe抽取符号表,生成生成test.pdb文件
  4. pdb与dmp整合定位
    a) 使用VS进行调试
    导入dmp文件,加载pdb符号文件,点击调试,无法获得崩溃位置,提示如下:
    在这里插入图片描述
    提示不支持改pdb文件,但更具dmp文件基础信息可以区分野指针与空指针。

五、下一步计划

1、测试windbg与minidump_stackwalk是否可以调试cv2pdb64.exe生成的pdb文件
2、分析cv2pdb64.exe生成的pdb文件为什么无法用于调试
3、将Qmake构建脚本转为cmake脚本,尝试编译.lib静态库

欢迎各位C++开发者建言献策!!!

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C/C++应用程序在遇到宕机或崩溃时,可以生成dump文件,用于分析和排查问题。dump文件是一个二进制文件,包含了应用程序当前状态的所有信息,例如寄存器的值、堆栈信息、内存快照等。 生成dump文件的过程通常需要在宕机发生时进行设置,在代码中添加相应的处理逻辑。可以使用操作系统提供的工具或使用一些第三方库来生成dump文件。 在Windows操作系统中,可以使用Windows Error Reporting(WER)来生成dump文件。WER会通过注册表设置或程序运行时设置来配置生成dump文件的方式和路径。可以通过指定参数和设置注册表来控制生成dump文件的级别(如只生成小型或完全的dump文件)。当应用程序发生崩溃时,WER会拦截并触发生成dump文件。使用WER生成dump文件可以在调试器中打开进行分析。 在Linux操作系统中,可以使用glibc库的backtrace机制来生成dump文件。通过设置信号处理函数,将崩溃时的堆栈信息写入文件。可以通过注册信号处理函数,并在函数中使用backtrace和backtrace_symbols将堆栈信息写入文件。 除了使用操作系统提供的工具和机制,还可以使用一些第三方库来生成dump文件,如Google Crashpad和Breakpad等。这些库提供了更灵活和可定制的选项,可以在崩溃发生时执行回调函数,并根据需求生成dump文件。 总之,通过生成dump文件,我们可以在程序崩溃时获取并保存关键的调试信息,有助于分析和定位问题的根源,提高应用程序的稳定性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值