• 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

  • 相关阅读:
    Oracle11以后的行列转换
    stream重复Key的处理
    EasyUI笔记(一)Base基础
    jQuery笔记(六)jQuery之Ajax
    【jQuery实例】Ajax登录页面
    jQuery笔记(五)jQuery表单验证
    jQuery笔记(四)jQuery中的动画
    jQuery笔记(三)jQuery中的事件
    jQuery笔记(二)jQuery中DOM操作
    jQuery笔记(一)jQuery选择器
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/14430747.html
Copyright © 2020-2023  润新知