• 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

  • 相关阅读:
    深度学习跟SLAM的结合点
    谷歌浏览器自动更新后,chromedriver和浏览器的版本不匹配
    Cheat Engine 中文设置汉化教程
    Java代码实现sha256加密
    VUE ELELEMENT table默认选中
    Java中如何遍历Map对象的4种方法
    Spring boot @Value注解详解
    jQuery向webApi提交post json数据
    Java RSA非对称加密工具类(就这一篇就够了)
    Vue父组件调用子组件的方法
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/14430747.html
Copyright © 2020-2023  润新知