QT通过QBreakpad捕捉崩溃

打印 上一主题 下一主题

主题 868|帖子 868|积分 2604

最近在公司项目上遇到程序运行时崩溃,也不好在log日志中定位。查找了资料发现,谷歌的一个开源项目Breakpad,统一了这三平台win、linux、mac生成dump的方式来捕捉崩溃。
大致研究了一下,主要依赖一个静态库和几个头文件,我这边编译出来放到网盘上大家自行使用。
链接: https://pan.baidu.com/s/19elsFxnKfzdNaX6cURruAw?pwd=JJLM 提取码: JJLM 
用法就是在工程文件pro里引入库:
  1. ############ for qBreakpad ############
  2. # qBreakpad中需要使用到network模块
  3. QT += network
  4. # 启用多线程、异常、RTTI、STL支持
  5. CONFIG += thread exceptions rtti stl
  6. # without c++11 & AppKit library compiler can't solve address for symbols
  7. CONFIG += c++11
  8. macx: LIBS += -framework AppKit
  9. # 配置头文件搜索路径和链接库路径
  10. win32:CONFIG(release, debug|release): {
  11. LIBS += -L$$PWD/qbreakpadlib/lib/release/ -lqBreakpad
  12. DEPENDPATH += $$PWD/qbreakpadlib/lib/release
  13. }
  14. else:win32:CONFIG(debug, debug|release): {
  15. LIBS += -L$$PWD/qbreakpadlib/lib/debug/ -lqBreakpad
  16. DEPENDPATH += $$PWD/qbreakpadlib/lib/debug
  17. }
  18. INCLUDEPATH += $$PWD/qbreakpadlib/include
  19. ############ for qBreakpad ############
复制代码
然后在main.cpp中添加调用代码,如下:
  1. 1 #include "qBreakpadTest.h"
  2. 2 #include <QApplication>
  3. 3
  4. 4 #include "QBreakpadHandler.h"
  5. 5
  6. 6 int main(int argc, char *argv[])
  7. 7 {
  8. 8     QApplication a(argc, argv);
  9. 9     
  10. 10     QBreakpadInstance.setDumpPath("crashes");    // 设置生成dump文件路径
  11. 11     qBreakpadTest w;
  12. 12     w.show();
  13. 13     return a.exec();
  14. 14 }
复制代码
之后程序如果崩溃会在你设置的路径位置生成一个bmp文件,拿到这个文件与程序的pdb文件就可以定位到具体某一行了,具体操作方法如下:
我这里使用VS 2019,来进行如下的操作。
Vs文件菜单下,选择“打开”->“文件”,如下:(也可以直接选择拖拽dump文件到Vs也是一样)

 找到dump文件,并打开,可以看到转储摘要和模块等,但是并不能发现问题何在。如下:

 接下来,点击“设置符号路径”,点击“+”号,添加pdb文件路径,之后,“确定”。如下:

 最后,点击“使用 仅限本机 进行调试”,可以很清楚的,定位到崩溃发生的代码行上。
注意,源码一定不能变化,哪怕只是更改加入了一行或者什么空格,都会导致定位错误或者只能定位大概位置,所以源码一定要和编译出exe时一致。
原文地址:Qt Windows系统使用QBreakpad实战_qbreakpad vs_Fu_Lin_的博客-CSDN博客
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表