Qt使用MinGW编译器构建工程时利用QBreakPad+CV2Pdb定位软件问题

前言

       程序开发过程中,需要对软件问题进行定位,在DEBUG模式下,开发者可以很快速的定位到问题发生所在位置,但是对于Release模式来说,开发者无法定位到问题所在。并且在用户使用过程中产生的错误,如果能够产生dump文件并使用开发过程中生成的pdb文件,能够帮助开发者快速定位问题并修复。

BreakPad介绍

       Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合。而且BreakPad本来就是为了解决C、C++异常捕获而开发的。BreakPad支持跨平台,很容易在Qt项目中使用,使跨平台的应用实现跨平台异常捕获。

开发前准备

BreakPad源码:GitHub - google/breakpad: Mirror of Google Breakpad project

QBreakPad源码:GitHub - buzzySmile/qBreakpad: Cross-platform Qt crash handler, implemented as wrapper around google-breakpad

cv2pdb下载链接:GitHub - rainers/cv2pdb: converter of DMD CodeView/DWARF debug information to PDB files

编译QBreakPad源码

1.将下载好的qbreakpad源码进行解压,解压后文件如下:

2.将下载好的BreakPad源码放入qbreakpad源码目录下的third_party\breakpad下,如图:

3.使用QT打开handler文件夹下的handler.pro

4.根据所需的库版本进行编译即可

5.编译好后默认会在handler目录下生成静态库文件,这里作者使用的是MinGW编译器,因此生成的为.a文件

编译成功后,我们就可以使用qbreakpad了。

使用QBreakPad

这里我们创建一个名为QBreakPadDemo的项目来测试我们刚生成的库,结构如下:

QBreakPad_Lib文件如下:

这里的libqBreakPad.a和libqBreaPadd.a两个库分别对应debug模式下的库和release模式下的库。

放好所需文件后,在工程的pro文件中添加如下配置:

其中红色框选的部分是为了让release模式下也能带调试信息,方便后面使用cv2pdb利用release模式下生成的EXE来生成pdb文件。代码如下:

CONFIG += force_debug_info
QMAKE_CXXFLAGS += -g
QMAKE_CFLAGS += -g
CONFIG += thread exceptions rtti stl

修改pro文件后建议执行以下qmake来是配置文件生效(该步骤可以忽略)

接下来的代码,我在UI界面中拖出来了一个按钮,当按钮点击时,软件会访问一个未分配的内存,导致内存泄漏

void MainWindow::on_pushButton_clicked()
{
    int *p = nullptr;
    *p = 10;
}

运行程序,当点击界面上的按钮时,软件会异常结束。

我们可以去软件目录下,去查看生成的crash文件夹,生成的dump文件就在里面

我们使用VS打开该文件

打开后点击右上角使用 仅限本机 进行调试

点击后,会出现未加载QBreakPadDemo.pdb的报错

这时候我们就需要配合上cv2pdb来使用其为我们的软件生成pdb文件,我们再次回到Qt项目中,点击Qt Creator中的项目

进入这个界面后,我们在构建的步骤处点击添加构建步骤,选择custom Process Step

在命令处点击右方浏览,进入浏览界面,选择下载好的cv2pdb.exe

参数栏选择ActicvProject:RunConfig:Executable:FilePath

这样在我们的软件生成路径下,每次编译后就有pdb生成了

接下来我们重新打开dump文件,打开后在右上角点击设置符号路径

进入后点击+号,并且填入我们pdb生成的路径

设置好后,点击确认,再次点击使用仅限本机进行调试

现在我们的dump文件就可以和我们的pdb文件配合使用,定位到软件异常代码行数了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值