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源码的下载和编译
下载
breakpad
1
git clone https://github.com/google/breakpad
下载
linux_syscall_support.h
从该网址下载:http://www.qt-ui.com/attachment/
然后把
linux_syscall_support.h
放到breakpad/src/third_party/lss/
目录中。编译
1
2
3
4cd breakpad
./configure --prefix=/home/yun/breakpad
make
make installPS:
/home/yun/breakpad
是我的home目录,根据自己的修改,只要能找到该路径就行。
Step 2: 如何使用
新建一个“QT控制台应用程序”工程
找到上面编译生成的
breakpad
文件夹,把整个breakpad
文件夹复制到你的QT工程目录下。如果嫌弃占用内存太大,可以删掉一些不需要使用的文件。
- bin和share文件夹可删除;
- lib文件夹:保留
libbreakpad_client.a
,其他的可删除;
可以直接下载我编译整理后的文件:
1
git clone git@github.com:LKevin98/Google-Breakpad.git
整理后的breakpad文件夹目录如下:
添加刚生成的
libbreakpad_client.a
库文件鼠标右击工程名称,选择”Add Library”,next
选择”External library”,next
点击”Browsed”按钮找到
libbreakpad_client.a
文件后面一直点击next到完成即可。
接下来在代码include下面的头文件,即可使用google_breakpad:
1
#include "client/linux/handler/exception_handler.h"
完整例程代码:
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
文件。
附录
编译过程可能会出现下面的错误,把错误这两行代码删除重新编译即可。
参考链接:
【1】https://blog.csdn.net/u011720560/article/details/105639279