最近在公司项目上遇到程序运行时崩溃,也不好在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博客
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |