天空闲话 发表于 2023-9-6 21:38:55

QT通过QBreakpad捕捉崩溃

最近在公司项目上遇到程序运行时崩溃,也不好在log日志中定位。查找了资料发现,谷歌的一个开源项目Breakpad,统一了这三平台win、linux、mac生成dump的方式来捕捉崩溃。
大致研究了一下,主要依赖一个静态库和几个头文件,我这边编译出来放到网盘上大家自行使用。
链接: https://pan.baidu.com/s/19elsFxnKfzdNaX6cURruAw?pwd=JJLM 提取码: JJLM 
用法就是在工程文件pro里引入库:
############ for qBreakpad ############
# qBreakpad中需要使用到network模块
QT += network

# 启用多线程、异常、RTTI、STL支持
CONFIG += thread exceptions rtti stl

# without c++11 & AppKit library compiler can't solve address for symbols
CONFIG += c++11
macx: LIBS += -framework AppKit

# 配置头文件搜索路径和链接库路径
win32:CONFIG(release, debug|release): {
LIBS += -L$$PWD/qbreakpadlib/lib/release/ -lqBreakpad
DEPENDPATH += $$PWD/qbreakpadlib/lib/release
}
else:win32:CONFIG(debug, debug|release): {
LIBS += -L$$PWD/qbreakpadlib/lib/debug/ -lqBreakpad
DEPENDPATH += $$PWD/qbreakpadlib/lib/debug
}

INCLUDEPATH += $$PWD/qbreakpadlib/include

############ for qBreakpad ############然后在main.cpp中添加调用代码,如下:
1 #include "qBreakpadTest.h"
2 #include <QApplication>
3
4 #include "QBreakpadHandler.h"
5
6 int main(int argc, char *argv[])
7 {
8   QApplication a(argc, argv);
9   
10   QBreakpadInstance.setDumpPath("crashes");    // 设置生成dump文件路径
11   qBreakpadTest w;
12   w.show();
13   return a.exec();
14 }之后程序如果崩溃会在你设置的路径位置生成一个bmp文件,拿到这个文件与程序的pdb文件就可以定位到具体某一行了,具体操作方法如下:
我这里使用VS 2019,来进行如下的操作。
Vs文件菜单下,选择“打开”->“文件”,如下:(也可以直接选择拖拽dump文件到Vs也是一样)
https://img2023.cnblogs.com/blog/3136848/202309/3136848-20230906213941736-11045844.png
 找到dump文件,并打开,可以看到转储摘要和模块等,但是并不能发现问题何在。如下:
https://img2023.cnblogs.com/blog/3136848/202309/3136848-20230906213957936-746546104.png
 接下来,点击“设置符号路径”,点击“+”号,添加pdb文件路径,之后,“确定”。如下:
https://img2023.cnblogs.com/blog/3136848/202309/3136848-20230906214012622-953344784.png
 最后,点击“使用 仅限本机 进行调试”,可以很清楚的,定位到崩溃发生的代码行上。
注意,源码一定不能变化,哪怕只是更改加入了一行或者什么空格,都会导致定位错误或者只能定位大概位置,所以源码一定要和编译出exe时一致。
原文地址:Qt Windows系统使用QBreakpad实战_qbreakpad vs_Fu_Lin_的博客-CSDN博客
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: QT通过QBreakpad捕捉崩溃