前言测试的同事反馈程序运行后挂机 1 天后突然闪退需要找出问题并解决 bug这里分享一下定位问题的经过。经过查询资料打算集成 Google Breakpad 的 Qt 封装库——qBreakpad到程序中能实现程序奔溃时自动生成dump文件和pdb文件再经过vs工具分析bug,找到问题。使用步骤下载源码编译生成 lib。在程序中 include 头文件就可以在你的程序中集成了。在程序崩溃时自动生成 dump 文件。利用工具分析 dump 文件。一、源码准备1. 下载 Breakpad 源码https://github.com/google/breakpad2. 下载 qBreakpad 源码https://github.com/buzzySmile/qBreakpad.git3. 下载 LSS 源码https://github.com/plexinc/breakpad-lss/tree/master只需要 linux_syscall_support.h 这个 .h 文件就可以或者直接用现成我集成好的:包含了 qBreakpad、Breakpad、LSS 完整的工程。网盘链接: https://pan.baidu.com/s/1iCmk_wQpU-ZPBn1rGTwQXg 提取码: ea85如果用网盘的代码下面这一步(第4点)可以忽略。4.将 qBreakpad、breakpad、lss 源码下载完成后解压后把 breakpad、lss 放入 qBreakpad 的 third_party 目录下如下二、qBreakpad工程介绍在qBreakpad源码目录下使用QtCreator打开qBreakpad.pro工程如下demo工程下有2个演示程序program和reporter分别实现了演示生成dump文件、上报dump文件的功能。handler为静态库工程该工程封装了Breakpad直接编译此工程可生成qBreakpad.lib。tests为测试工程。三、编译生成qBreakpad.lib1.在Debug、Release模式下编译handler工程生成2个版本的qBreakpad.lib静态库。由于我只需要在Release模式下调试下面就只演示Release模式下的编译过程。编译后生成的.lib 如下图说明Release模式不会自动生成pdb文件这里只需要拿到对应的.lib文件即可四、在要调试的程序中调用qBreakpad1.在工程目录下建立qbreakpadlib目录。2.新建qbreakpadlib\lib\release目录把release版qBreakpad.lib拷贝至此。3.再将下图的2个头文件以及singleton文件夹一起拷贝到include下即可。此时qbreakpadlib的目录结构如下4.在项目的.pro文件中添加如下内容############forqBreakpad #############qBreakpad中需要使用到network模块QTnetwork # 启用多线程、异常、RTTI、STL支持 CONFIGthread exceptions rtti stl#withoutc11AppKit library compiler cant solve addressforsymbolsCONFIGc11macx: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 ############forqBreakpad ############5.然后在main.cpp中添加调用代码如下#includeQApplication#includeQBreakpadHandler.h//添加头文件intmain(intargc,char*argv[]){QApplicationa(argc,argv);QBreakpadInstance.setDumpPath(crashes);// 设置生成dump文件路径...........}五、生成Release pdb文件之前说过在release模式下不会生成pdb文件有这个pdb文件会更容易定位问题所以需要在qBreakpadTest.pro文件中添加如下内容让release版程序带上调试信息QMAKE_CXXFLAGS_RELEASE$$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE$$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFOwin系统下程序的调试信息是在单独的pdb文件中在其他linux、mac等系统下程序的调试信息就包含在程序本体内部所以带调试信息的程序一般比不带调试信息的大。清除以后qmake,再次编译可以看到已经生成了“程序名.pdb”六、测试故意写了一个会引起程序奔溃的语句生成dump文件特别注意如果使用MinGW编译程序无法生成pdb文件这点需要注意一下。必须使用MSVC编译方可生成pdb文件。目前我们已经生成了程序的pdb调试信息文件并且程序执行过程中发生崩溃也可以自动记录dump文件这2个文件已经具备接下来我们看看如何利用他们定位到bug所在位置。七、使用VS进行调试我这里使用VS 2017来进行如下的操作。1.打开dump文件Vs文件菜单下选择“打开”-“文件”或者直接拖拽。2.找到dump文件并打开。3.设置pdb文件路径接下来点击“设置符号路径”点击“”号添加pdb文件路径之后“确定”。如下选择使用仅限本机进行调试看到它自己定位到出现bug的位置了。注意生成bug时候的代码必须和分析bug时候的代码一样不然工具就会找不到出现bug的位置引用Qt Windows系统使用QBreakpad实战Qt qBreakPad使用windows
[QT]window下使用集成qBreakpad定位闪退的问题
前言测试的同事反馈程序运行后挂机 1 天后突然闪退需要找出问题并解决 bug这里分享一下定位问题的经过。经过查询资料打算集成 Google Breakpad 的 Qt 封装库——qBreakpad到程序中能实现程序奔溃时自动生成dump文件和pdb文件再经过vs工具分析bug,找到问题。使用步骤下载源码编译生成 lib。在程序中 include 头文件就可以在你的程序中集成了。在程序崩溃时自动生成 dump 文件。利用工具分析 dump 文件。一、源码准备1. 下载 Breakpad 源码https://github.com/google/breakpad2. 下载 qBreakpad 源码https://github.com/buzzySmile/qBreakpad.git3. 下载 LSS 源码https://github.com/plexinc/breakpad-lss/tree/master只需要 linux_syscall_support.h 这个 .h 文件就可以或者直接用现成我集成好的:包含了 qBreakpad、Breakpad、LSS 完整的工程。网盘链接: https://pan.baidu.com/s/1iCmk_wQpU-ZPBn1rGTwQXg 提取码: ea85如果用网盘的代码下面这一步(第4点)可以忽略。4.将 qBreakpad、breakpad、lss 源码下载完成后解压后把 breakpad、lss 放入 qBreakpad 的 third_party 目录下如下二、qBreakpad工程介绍在qBreakpad源码目录下使用QtCreator打开qBreakpad.pro工程如下demo工程下有2个演示程序program和reporter分别实现了演示生成dump文件、上报dump文件的功能。handler为静态库工程该工程封装了Breakpad直接编译此工程可生成qBreakpad.lib。tests为测试工程。三、编译生成qBreakpad.lib1.在Debug、Release模式下编译handler工程生成2个版本的qBreakpad.lib静态库。由于我只需要在Release模式下调试下面就只演示Release模式下的编译过程。编译后生成的.lib 如下图说明Release模式不会自动生成pdb文件这里只需要拿到对应的.lib文件即可四、在要调试的程序中调用qBreakpad1.在工程目录下建立qbreakpadlib目录。2.新建qbreakpadlib\lib\release目录把release版qBreakpad.lib拷贝至此。3.再将下图的2个头文件以及singleton文件夹一起拷贝到include下即可。此时qbreakpadlib的目录结构如下4.在项目的.pro文件中添加如下内容############forqBreakpad #############qBreakpad中需要使用到network模块QTnetwork # 启用多线程、异常、RTTI、STL支持 CONFIGthread exceptions rtti stl#withoutc11AppKit library compiler cant solve addressforsymbolsCONFIGc11macx: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 ############forqBreakpad ############5.然后在main.cpp中添加调用代码如下#includeQApplication#includeQBreakpadHandler.h//添加头文件intmain(intargc,char*argv[]){QApplicationa(argc,argv);QBreakpadInstance.setDumpPath(crashes);// 设置生成dump文件路径...........}五、生成Release pdb文件之前说过在release模式下不会生成pdb文件有这个pdb文件会更容易定位问题所以需要在qBreakpadTest.pro文件中添加如下内容让release版程序带上调试信息QMAKE_CXXFLAGS_RELEASE$$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE$$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFOwin系统下程序的调试信息是在单独的pdb文件中在其他linux、mac等系统下程序的调试信息就包含在程序本体内部所以带调试信息的程序一般比不带调试信息的大。清除以后qmake,再次编译可以看到已经生成了“程序名.pdb”六、测试故意写了一个会引起程序奔溃的语句生成dump文件特别注意如果使用MinGW编译程序无法生成pdb文件这点需要注意一下。必须使用MSVC编译方可生成pdb文件。目前我们已经生成了程序的pdb调试信息文件并且程序执行过程中发生崩溃也可以自动记录dump文件这2个文件已经具备接下来我们看看如何利用他们定位到bug所在位置。七、使用VS进行调试我这里使用VS 2017来进行如下的操作。1.打开dump文件Vs文件菜单下选择“打开”-“文件”或者直接拖拽。2.找到dump文件并打开。3.设置pdb文件路径接下来点击“设置符号路径”点击“”号添加pdb文件路径之后“确定”。如下选择使用仅限本机进行调试看到它自己定位到出现bug的位置了。注意生成bug时候的代码必须和分析bug时候的代码一样不然工具就会找不到出现bug的位置引用Qt Windows系统使用QBreakpad实战Qt qBreakPad使用windows