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也是一样)

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

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

 最后,点击“使用 仅限本机 进行调试”,可以很清楚的,定位到崩溃发生的代码行上。

注意,源码一定不能变化,哪怕只是更改加入了一行或者什么空格,都会导致定位错误或者只能定位大概位置,所以源码一定要和编译出exe时一致。

原文地址:Qt Windows系统使用QBreakpad实战_qbreakpad vs_Fu_Lin_的博客-CSDN博客

 

热门相关:如果能少爱你一点   魔神狂后   悠哉兽世:种种田,生生崽   重生之将门毒后   悠哉兽世:种种田,生生崽