前言
程序开发过程中,需要对软件问题进行定位,在DEBUG模式下,开发者可以很快速的定位到问题发生所在位置,但是对于Release模式来说,开发者无法定位到问题所在。并且在用户使用过程中产生的错误,如果能够产生dump文件并使用开发过程中生成的pdb文件,能够帮助开发者快速定位问题并修复。
BreakPad介绍
Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合。而且BreakPad本来就是为了解决C、C++异常捕获而开发的。BreakPad支持跨平台,很容易在Qt项目中使用,使跨平台的应用实现跨平台异常捕获。
开发前准备
BreakPad源码:GitHub - google/breakpad: Mirror of Google Breakpad project
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文件配合使用,定位到软件异常代码行数了。
1883

被折叠的 条评论
为什么被折叠?



