使用qBreakpad实现程序崩溃代码定位

Google Breakpad

Google Breakpad 是一个跨平台(Windows、Linux、macOS)的崩溃报告框架,通过生成 minidump(小型内存转储文件)记录崩溃时的线程、堆栈、寄存器等信息,帮助开发者定位问题。

qBreakpad

qBreakpad 是一个专为 Qt/C++ 应用程序设计的崩溃捕获与分析工具,基于 Google Breakpad 实现

qBreakpad使用场景

定位程序崩溃问题

列如如下代码

#include <QApplication>
#include "mainwindow.h"
#include "qBreakpad.h"  // qBreakpad 头文件

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    // 初始化 qBreakpad,设置崩溃转储保存路径
    QBreakpadInstance.setDumpPath("crash_dumps");
    // 人为触发空指针解引用崩溃
    int *ptr = nullptr;
    *ptr = 42;  // 崩溃点:此行代码会导致程序崩溃
    return a.exec();
}
1.运行代码生成dmp文件

运行上述代码将在程序bin目录下的crash_dumps目录下生成一个*.dmp文件

注意点:为了更准确定位崩溃代码,在生成代码时需要生成带调试pdb文件且需要禁用优化.右键c++项目需要做如下的步骤:

1.【C/C++】|【常规】|【调试信息格式】设置为(程序数据库/Zi)

2.【C/C++】|【优化】|【优化】设置为 已禁用

3.【链接器】|【生成调试信息】|【生成调试信息(/DEBUG)】

2.visual studio 载入dmp文件

打开visual studio 2022(选择自己版本的visual studio),将dmp文件拖入visual studio

3.调试定位

使用仅限本地进行调试(上图中标红的地方)。

如果是调试exe,可能马上就定位到崩溃代码。

如果崩溃是dll,可能需要右键【加载符号】按提示选择目录和文件

1.在调用堆栈选项中寻找到目标调用库,右键加载符号,选择要调试的dll文件

2.根据提示选择pdb所在目录

3.在调用堆栈中可见函数调用已经还原,双击要调试的函数

4.选择源代码所在目录

定位程序假死问题

1.打开任务管理器找到卡死的进程
2.选中进程右键【创建转存储文件】

转存文件存放在 Administator/AppData/Local/Tmep文件夹下, 转存储文件可能比较大(整个内存做了快照)

3.按照崩溃流程类似定位问题

使用场景流程

一般客户机器上出现崩溃情况下,可以将待调试版本发到客户器上,产生dmp文件,然后将dmp文件发回进行崩溃定位.

参考

1.QT通过QBreakpad捕捉崩溃

2.qt qBreakpad捕获崩溃

3.Google Breakpad应用:崩溃分析工具指南

4.【Qt 学习之路】抓取崩溃信息(读这一篇就够了)

posted @ 2025-03-30 23:31  焦涛  阅读(49)  评论(0)    收藏  举报