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博客