源码
将 Breakpad、LSS 源码放入third_party目录:
或者直接下载已经可以编译通过的版本:
https://pan.baidu.com/s/1G3gptCcxaPiXHM9KbnKThQ
密码:pzg5
编译
Windows MSVC
使用 VS2015
设置 handler 为启动项目,单独编译:
可以通过配置工程属性,生成 release 和 debug 版本。
Linux 下编译
源码bug修正
编译 handler 工程时,报错如下:
error: No rule to make target ‘…/…/qBreakpad-master/third_party/breakpad/src/common/convert_UTF.c’, needed by ‘_build/obj/convert_UTF.o’. Stop.
解决办法: 在 qBreakpad-master/third_party/breakpad.pri
中:
将
$$BREAKPAD_PATH/common/convert_UTF.c
改为:
$$BREAKPAD_PATH/common/convert_UTF.cc
另外链接时会报错如下:
exception_handler.cc: error: undefined reference to `breakpad_getcontext’
解决办法:该错误是链接 libqBreakpad.a
时,就会报错。在 qBreakpad-master/third_party/breakpad.pri
中,unix 下添加如下一行:
$$BREAKPAD_PATH/common/linux/breakpad_getcontext.S
测试
编写测试程序:
Pro 中增加的配置:
CONFIG += c++11 thread exceptions rtti stl
release 版本也生成:
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
库路径:
INCLUDEPATH += $$PWD/qBreakpad/inc
CONFIG(debug, debug|release) {
LIBS += -L$$PWD/qBreakpad/lib/debug -lqBreakpad
} else {
LIBS += -L$$PWD/qBreakpad/lib/release -lqBreakpad
}
源码:
#include "mainwindow.h"
#include <QApplication>
#include "QBreakpadHandler.h"
void crash()
{
volatile int* p = (int*)(NULL);
*p = 1;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
QBreakpadInstance.setDumpPath("crashes"); // 设置生成dump文件路径
// 执行此句发生异常时,会自动生成dump文件
crash();
return a.exec();
}
编译运行:
使用 VS 分析一下:
注意
- win系统下,程序的调试信息,是在单独的pdb文件中;在其他linux、mac等系统下,程序的调试信息就包含在程序本体内部,所以带调试信息的程序一般比不带调试信息的大。
- 如果是主程序+多个so的开发方式,需要使用上述方法,将每个so也附带调试信息,这样,在so中发生崩溃时,才能根据dump和调试信息定位到so的代码上。
- qBreakpad还提供了上报dump文件的方法。说白了就是,将生成的dump文件上传到指定的服务器。
参考
https://blog.csdn.net/zyhse/article/details/112852069
https://blog.csdn.net/robert_cysy/article/details/91948025