qBreakpad

源码

qBreakpad
Breakpad
LSS

将 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

原文地址:https://www.cnblogs.com/xiaojianliu/p/14430747.html