Linux下Google Breakpad捕获程序崩溃异常

本文最后更新于:2022年5月29日 上午

前言

关于捕获QT程序崩溃异常的方法,在Windows平台可以很简单实现,网上也可以找到许多例程源码。但是,在Linux平台的教程方法很少,而且就算有教程也说得不是很清楚,这里记录一下自己在Linux平台使用Google Breakpad捕获程序崩溃异常的方法。

  • 系统: Ubuntu 16.04
  • Qt: Qt 5.14.1
  • 编译器:GCC 5.3.1

Step 1: Google Breakpad源码的下载和编译

  1. 下载breakpad

    1
    git clone https://github.com/google/breakpad
  2. 下载linux_syscall_support.h

    从该网址下载:http://www.qt-ui.com/attachment/

    然后把linux_syscall_support.h放到breakpad/src/third_party/lss/目录中。

    DJS5uT.png

  3. 编译

    1
    2
    3
    4
    cd breakpad
    ./configure --prefix=/home/yun/breakpad
    make
    make install

    PS: /home/yun/breakpad是我的home目录,根据自己的修改,只要能找到该路径就行。

Step 2: 如何使用

  1. 新建一个“QT控制台应用程序”工程

    DJS7E4.png

  2. 找到上面编译生成的breakpad文件夹,把整个breakpad文件夹复制到你的QT工程目录下。

    如果嫌弃占用内存太大,可以删掉一些不需要使用的文件。

    • bin和share文件夹可删除;
    • lib文件夹:保留libbreakpad_client.a,其他的可删除;

    可以直接下载我编译整理后的文件:

    1
    git clone git@github.com:LKevin98/Google-Breakpad.git

    整理后的breakpad文件夹目录如下:
    DJSfg0.png

  3. 添加刚生成的 libbreakpad_client.a 库文件

    鼠标右击工程名称,选择”Add Library”,next

    DJShvV.png

    选择”External library”,next

    DJSIDU.png

    点击”Browsed”按钮找到libbreakpad_client.a文件

    DJSobF.png

    后面一直点击next到完成即可。

  4. 接下来在代码include下面的头文件,即可使用google_breakpad:

    1
    #include "client/linux/handler/exception_handler.h"
  5. 完整例程代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <QCoreApplication>
    #include <QDir>
    #include <QDebug>

    #include "client/linux/handler/exception_handler.h"

    // 程序崩溃回调函数;
    static bool dumpCallback(const google_breakpad::MinidumpDescriptor& descriptor,
    void* context, bool succeeded)
    {
    if (succeeded)
    {
    qDebug() << descriptor.path() << " Create dump file success";
    }
    else
    {
    qDebug() << descriptor.path() << " Create dump file failed";
    }
    return succeeded;
    }

    // 触发crash来测试
    void crash() {
    volatile int* a = (int*)(NULL);
    *a = 1;
    }

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    //获取程序当前运行目录
    QString appDirPath = QCoreApplication::applicationDirPath() + "/crash";

    QDir dir;
    if (!dir.exists(appDirPath))
    {
    bool res = dir.mkpath(appDirPath);
    qDebug() << "New mkdir " << appDirPath << " " << res;
    }

    // minidump文件写入到的目录
    google_breakpad::MinidumpDescriptor descriptor(QString(appDirPath).toStdString());
    // 创建捕捉程序异常对象;
    google_breakpad::ExceptionHandler eh(descriptor,
    nullptr,
    dumpCallback,
    nullptr,
    true,
    -1);

    crash();
    return a.exec();
    }

    编译运行上面的程序,会在crash路径下生成*.dmp文件。

附录

编译过程可能会出现下面的错误,把错误这两行代码删除重新编译即可。

DJSHUJ.png

参考链接:

【1】https://blog.csdn.net/u011720560/article/details/105639279

【2】https://github.com/google/breakpad


Linux下Google Breakpad捕获程序崩溃异常
https://kevinloongc.github.io/posts/7a4867a0.html
作者
Kevin Loongc
发布于
2020年11月23日
许可协议