12.5-使用Qt实现跨平台C++崩溃捕获,看这一篇就足够了(Breakpad)

一、软件奔溃捕获的意义应用程序发布后,不能保证百分百没有bug并引发崩溃。因此,在出现崩溃的情况下需要记录崩溃详情并给用户弹出崩溃提示对话框,提示用户重启软件以及上报(上传)崩溃。这样做意义是:能保证软件在使用过程中发现的bug都能被收集起来,并根据崩溃详情修改bug,然后发布修复bug的版本。如果软件在使用过程中直接闪退没有任何提示,不仅用户体验不好,还无法获取崩溃的原因。之后更具用户反馈...
摘要由CSDN通过智能技术生成

一、软件奔溃捕获的意义

应用程序发布后,不能保证百分百没有bug并引发崩溃。因此,在出现崩溃的情况下需要记录崩溃详情并给用户弹出崩溃提示对话框,提示用户重启软件以及上报(上传)崩溃。
这样做意义是:
能保证软件在使用过程中发现的bug都能被收集起来,并根据崩溃详情修改bug,然后发布修复bug的版本。如果软件在使用过程中直接闪退没有任何提示,不仅用户体验不好,还无法获取崩溃的原因。之后更具用户反馈的口头描述来找bug就会非常头疼了。

二、Breakpad介绍

  1. breakpad简介
    Breakpad是Google公司开发的开源多平台C++崩溃检测库。Breakpad可以捕获发布给用户的应用程序的崩溃,并记录软件崩溃的调试信息到“minidump”文件中。调试信息包括错误行号,报错详情,堆栈错误(stack traces)。软件崩溃时候把生成的“minidump”上传到自己的服务器上就可已方便的获取足够细致崩溃详情。
    支持平台:
    windows、linux、mac、ios、solaris、android ndk
  2. breakpad实现原理简单了解
  • 在不同平台下使用平台特有的函数以及方式实现异常捕获:
    Windows:通过SetUnhandledExceptionFilter()设置崩溃回掉函数
    Max OS:监听 Mach Exception Port 获取崩溃事件
    Linux:监听 SIGILL SIGSEGV 等异常信号 获取崩溃事件
  • MiniDump文件格式
    minidump是由微软开发的崩溃记录文件格式。minidump为二进制文件,体积小。为了保持统一,breakpad在其他系统下也选择生成minidump文件。
  • BreakPad工作原理示意图
    在这里插入图片描述
    示意图要表达的意思如下:
    a. 包含了breakpad客户端(静态库)的应用程序在发布Release版本的时候。在编译的时候选择保留调试信息。
    b. 使用Breakpad提供的dump_syms工具根据release版本程序生成“symbols文件”。“symbols文件”包括程序之前保留的调试信息。
    c. 发布给用户的release版本程序发生崩溃后包含在程序内“breakpad客户端”会捕捉崩溃并生成“minidump文件”。
    d. “minidump文件”被应用程序发送到你指定的服务器,或通过其他方式收到用户软件崩溃产生的“minidump文件”。
    e. 收到“minidump文件”后,结合发布应用的所对应的 “symbols文件”,通过“minidump_stackwalk” 工具来转换生成文本格式的“stack trace 文件”。这个文件内的信息就是程序员可以直接阅读的崩溃堆栈详情。从而准确的找到触发崩溃的bug。

三、Qt工程中加入breakpad库的方法

breakpad可以先编译生成lib文件,然后在加入到自己的qt工程,也可以直接使用源码加入到自己的qt工程中。
为了方便在Qt中加入breakpad并且方便在多个平台编译,这里使用“源码添加breakpad库“的方式。
在Qt工程加入Breakpad的步骤如下:

  1. 下载源码:https://github.com/google/breakpad
  2. 把源码放置到自己工程目录里面,我这里使用的目录是:third_libs/breakpad/thirdparty
  3. 编写“breakpad.pri”文件用于在工程中引入所需要的breakpad源文件,把文件放置到和breakpad源码相同的目录。
  4. 编写多平台封装类。breakpad在不同系统中有不同的崩溃回调函数。为了实现跨平台使用breakpad,需要做一个封装类,然后对外提供一个唯一的接口。编写一个封装类为“BreakpadHandler”,放置在third_libs/breakpad/src目录中。
  5. 接着编写自己封装类的引入文件“breakpadsrc.pri”。并放置在third_libs/breakpad目录中。此配置文件还包括一些编译参数设置,从而包在各个平台的编译生成的release版本中包含调试信息。同时此文件相当于把整个breakpad相关的文件和配置整理到了一起。从而形成一个跨平台的breakpad模块。在自己的Qt工程中直接引入此模块,即可使用所有Breakpad的功能。
  6. 完成以上所有步骤,最终形成的目录结构如下图所示:
    在这里插入图片描述
  7. 由于引入文件“breakpad.pri”、“breakpadsrc.pri”和“BreakpadHandler封装类”中的内容很长,因此不便在这里列出。请参考本文第九节中所列出的源码地址。源码中不仅集成了breakpad库,并且包含完整使用示例。

四、测试是否可以生成dump崩溃文件

为了演示上一节所制作的Brakpad库的使用方法。本文专门编写了一个示例工程“BreakpadDemo”。工程的编写过程如下:

  1. 使用Qt Creater新建一个工程,叫做“BreakpadDemo”
  2. 在工程的pro文件中引入之前编写好的brakpad模块
QT       += core gui network //本例子包含网络上传代码
# link qBreakpad library
include($$PWD/third_libs/breakpad/breakpadsrc.pri)
  1. 在工程的main.cpp文件编写如下代码:
#include <QApplication>
#include "BreakpadHandler.h"

void crash() {
    volatile int* a = (int*)(NULL); *a = 1; }

int main(int argc, char *argv[])
{
   
    QApplication app (argc, argv);
    //those settings are need by QStandardPaths and breakpad
    QCoreApplication
  • 18
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
Breakpad 是一个开源的崩溃报告库,它可以捕获应用程序的崩溃信息,生成崩溃报告,以便于开发人员进行分析和修复。 要捕获 C++ 标准库的崩溃,需要使用 Breakpad 提供的异常处理机制。在 C++ 中,异常是通过 `try-catch` 语句块来处理的,当程序遇到异常时,会跳转到相应的 `catch` 块中进行处理。Breakpad 利用这个机制,在 `catch` 块中捕获异常并生成崩溃报告。 具体的实现步骤如下: 1. 在应用程序中使用 Breakpad 库,将崩溃信息保存到指定的文件中。 2. 在程序中使用 `try-catch` 语句块捕获异常。 3. 在 `catch` 块中,调用 Breakpad 提供的函数,将崩溃信息写入文件。 以下是一个使用 Breakpad 捕获 C++ 标准库崩溃的示例代码: ```c++ #include <stdexcept> #include "client/linux/handler/exception_handler.h" bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { // 将崩溃信息写入文件 return succeeded; } int main() { // 创建 Breakpad 异常处理器 google_breakpad::MinidumpDescriptor descriptor("."); google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback, NULL, true, -1); try { // 在这里写下可能会抛出异常的代码 throw std::runtime_error("C++ 标准库崩溃"); } catch (...) { // 在 catch 块中调用 Breakpad 的 WriteMinidump 函数 eh.WriteMinidump(); } return 0; } ``` 在上面的代码中,`DumpCallback` 函数用于将崩溃信息写入文件,`main` 函数中创建了一个 Breakpad 异常处理器,并在 `try-catch` 语句块中捕获异常。当程序遇到异常时,会跳转到 `catch` 块中,调用 Breakpad 的 `WriteMinidump` 函数将崩溃信息写入文件。 需要注意的是,使用 Breakpad 捕获崩溃信息时,需要在编译时链接 Breakpad 库,并将 Breakpad 的头文件包含在程序中。同时,需要在程序中注册异常处理器,以便于在发生异常时能够捕获崩溃信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值