Linux下Qt程序用qBreakpad定位崩溃位置

news2024/11/18 3:34:25

目录

  • 1. 使用qBreakpad
    • 1.1. 下载
    • 1.2. 编译
    • 1.3. 使用
  • 2. 使用dump文件
    • 2.1. 编译breakpad
    • 2.2. 解析dmp文件
      • 生成sym文件
    • 2.3. 解析dmp
      • 可能遇到的问题
        • 问题一

Qt程序的release版本交付给用户或者测试后,如果出现崩溃,很多时候都比较难重现,如果程序能自动定位到出错的位置,可以大大降低重现难度。
google的qBreakpad库提供了在Qt程序崩溃时生成dump文件的功能,dump文件配合breakpad的工具可以定位到程序出错的函数及其行号。

1. 使用qBreakpad

1.1. 下载

qBreakpad依赖了breakpad和lss,所以要把breakpad和lss也下载了。
qBreakpad下载地址:https://github.com/buzzySmile/qBreakpad
breakpad下载地址:https://github.com/google/breakpad/tree/v2021.08.09
lss下载地址:https://github.com/ithaibo/linux-syscall-support

编译qBreakpad的时候可能会报各种错误,应该跟版本不兼容有关,网上给出的解决方案也因为版本不一致的缘故,不一定有用,如果编译不过的话可以参考我选的版本。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2. 编译

把下载好的breakpad和linux-syscall-support解压后分别改名为breakpad和lss,放到qBreakpad的third_party路径下,如下图所示。
在这里插入图片描述
用qtcreator打开qBreakpad.pro,项目里包含了demo、handler、tests三个子模块,对它们分别进行编译。
在这里插入图片描述
三个模块都编译没有出错,代表版本的兼容性没有问题。
其中handler模块编译出来的库是我们需要的,另外两个模块可以不管,主要用来测试能不能编得过。
进入handler可以看到以下文件,代表编译成功。
在这里插入图片描述

1.3. 使用

创建一个测试项目crash_demo,把qBreakpad/handler里的.h和.a文件复制到项目中,如下图所示。
在这里插入图片描述
在这里插入图片描述
然后在crash_demo.pro里加入以下语句。

#qBreakpad用到network模块
QT += network

#添加qBreakpad库
LIBS += -L$$PWD/qBreakpad/ -lqBreakpad
INCLUDEPATH += $$PWD/qBreakpad/
DEPENDPATH += $$PWD/qBreakpad/

#添加调试信息
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

在main.cpp加入以下代码。

#include "mainwindow.h"
#include <QApplication>
#include <QBreakpadHandler.h>
#include <QBreakpadHttpUploader.h>

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

    QBreakpadInstance.setDumpPath("crashes"); //设置dump生成的路径为crashes

    MainWindow w;
    w.show();
    return a.exec();
}

接下来,在项目中添加引起崩溃的代码,以下是我测试用的示例。
界面
在这里插入图片描述
代码,将界面上的两个按钮的点击信号和槽绑定。

void MainWindow::on_pushButton_clicked()
{
    int *a = new int;
    *a = 20;

    int *i = NULL;
    *i = 10;
}

void MainWindow::on_pushButton_2_clicked()
{
    int *i = NULL;
    *i = 10;
}

编译项目并运行,触发崩溃代码之后会看到dmp文件已被生成。
在这里插入图片描述

2. 使用dump文件

dump文件是经过加密的,打开后全是乱码,需要用工具来解析,breakpad提供了这样的工具。

2.1. 编译breakpad

编译需要breakpad和linux-syscall-support源码,直接编译上一节下载的源码即可,下面是编译的步骤。

  1. 把linux-syscall-support改名为lss,放到breakpad/src/third_party下,如图所示。在这里插入图片描述
  2. 回到breakpad目录,打开终端,执行以下命令。
./configure
make -j4
  1. 编译完成后,可以看到breakpad/src/tools/linux/dump_syms路径下生成了dump_syms可执行文件,如图所示,编译完成。在这里插入图片描述

如果编译的过程中出错,或者发现dump_syms没有被生成,可以直接去下载别人编译好的,不必纠结那么多,解决问题挺浪费时间的。
别人编译好的:https://download.csdn.net/download/a343981218/9722549

2.2. 解析dmp文件

生成sym文件

直接解析dmp文件只能看到函数的地址信息,看不到函数名,这样可读性很差,配合sym文件来解析dmp可以定位到函数名及其行号。
把crash_demo的可执行文件复制到dump_syms的同级目录下,如图所示。
在这里插入图片描述
打开终端,执行以下指令,这时候会生成一个crash_demo.sym文件。

./dump_syms ./crash_demo > crash_demo.sym

用编辑器打开crash_demo.sym,找到下图中框住的字符串,复制到剪切板,我这里的sym文件是F3001B6F0C80C8C37F6926EB67F753830。
在这里插入图片描述
sym文件需要用规定的目录结构来存放,创建以下目录结构,把sym文件放进去,如图所示。
symbol/crash_demo/F3001B6F0C80C8C37F6926EB67F753830
在这里插入图片描述

2.3. 解析dmp

把上一节生成的symbol文件夹和应用程序生成的crashes文件夹都复制到breakpad/src/processor.
在这里插入图片描述
打开终端,执行以下命令。

./minidump_stackwalk ./crashes/ba428698-a447-42bc-b7ab5380-d191d36f.dmp ./symbol > result.txt

执行完毕后会生成result.txt文件,打开它就可以看到程序的崩溃信息,与代码是相对应的。
在这里插入图片描述
在这里插入图片描述

可能遇到的问题

问题一

解析dmp文件后,得到的result.txt可能会只显示了十六进制的地址,没有显示函数名和行号,出现这种情况就代表解析时未找到sym文件。
解决方法:检查sym和dmp是否匹配,检查sym的路径是否有问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

赛卓电子冲刺科创板上市:计划募资11亿元,股东包括尚颀资本等

12月28日&#xff0c;赛卓电子科技&#xff08;上海&#xff09;股份有限公司&#xff08;下称“赛卓电子”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺上市&#xff0c;赛卓电子计划募资11亿元&#xff0c;将用于车规级芯片研发及产业化项…

高级网络复习——防火墙,OSPF协议,rip协议,三层,DHCP中继知识题解(带答案)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 简答题 二.选择题 前言 本章讲解讲解防火墙&#xff0c;OSPF协…

java多线程(9):线程状态

1 五大状态 2 线程方法 3 停止线程 不推荐使用JDK提供的 stop()、 destroy()方法。【已废弃】推荐线程自己停止下来建议使用一个标志位进行终止变量 &#xff0c;当flagfalse&#xff0c;则终止线程运行。package xiong.demo3;public class TestStop implements Runnable{//1.…

从DTCC2022盘点各大厂商如何看待数据库发展趋势

DTCC 2022 已落下帷幕有些时日&#xff0c;回顾大会上的一些分享&#xff0c;尤其是头一天上午几大数据库厂商均在演讲一开始纷纷表达了对数据库发展趋势的看法。从各个厂商的观点来看&#xff0c;对数据库发展趋势基本属于是不谋而合&#xff0c;未来数据库的样子离不开以下这…

MATLAB形态学的基本运算膨胀和腐蚀(开、闭运算)

形态学中两种基本的操作是膨胀和腐蚀&#xff0c;膨胀是指在图像中为其边界添加像素点&#xff0c;而腐蚀是其逆过程。对应的添加和移除像素点数依赖于处理图像结构元素矩阵的大小和形式。 一.膨胀处理 膨胀的运算符为⊕, A用B来膨胀写作A⊕B&#xff0c;MATLAB中提供了预定义…

小程序-小程序框架

目录 一&#xff0c;框架简介 响应的数据绑定 二&#xff0c;视图层 View WXML &#xff08;html&#xff09; WXSS 样式 JS 逻辑交互 三&#xff0c;事件 什么是事件 事件的使用方式 四&#xff0c;逻辑层 APP service 1&#xff0c;生命周期 生命周期演示 页面路…

快速排序(Java分治法)

快速排序&#xff08;Java分治法&#xff09; 文章目录快速排序&#xff08;Java分治法&#xff09;0、 分治策略1、思路步骤2、代码3、复杂度分析3.1 最好情况3.2 最坏情况3.3 平均情况3.4 性能影响因素4、合并排序VS快速排序5、参考0、 分治策略 快速排序是对气泡排序的一种改…

minio下载、安装、Java集成应用

1.下载MinIO 下载链接:https://dl.min.io/server/minio/release/windows-amd64/minio.exe 网盘:https://pan.baidu.com/s/1uS2ii958tTjnb0KTpsKpCg 提取码:3nr9 2.安装启动 下载好的文件不要双击,自己定义一个文件夹放下载好的文件,本文指定的位置D:\minio,同时创建一…

淮北绿金通过港交所上市聆讯:净利润再度下滑,收入依赖股东

12月27日&#xff0c;港交所披露的信息显示&#xff0c;淮北绿金产业投资股份有限公司&#xff08;下称“淮北绿金”&#xff09;通过港交所上市聆讯并递交了聆讯后招股书&#xff0c;光大证券国际为其独家保荐人。据了解&#xff0c;淮北绿金曾于2021年12月递表&#xff0c;20…

【答学员问】网站换ip后遇到的问题排查思路

文章目录遇到问题先进行基本的问题排查1. 查看IP2. 是否能通网3. 关闭防火墙和selinux4. 使用windows的浏览器访问问题复现1. 安装好wordpress &#xff0c;确保能够访问2. 修改IP&#xff0c;进行测试3. 访问测试&#xff1a;问题排查问题解决方案遇到问题 学员反馈在家访问网…

C++类和对象1:类是什么?对象是什么?

目录 类的引入 类的定义 类的定义规则 类域问题&#xff1a; 类的访问限定符及封装 访问限定符 封装 类的实例化 类对象的大小问题 this指针 This指针的一些特性&#xff1a; 类的引入 在学习C语言的时候&#xff0c;C语言是面向过程的&#xff0c;关注的是过程&#xff…

2023年5月北京老博会,医养家具展,护理床展,老年护理展

2023中国国际养老服务业博览会CISSE介绍&#xff1a; 2023中国国际养老服务业博览会&#xff08;CISSE&#xff09;将于5月5-7日在北京国家会议中心举行。大会以养老产业为主题&#xff0c;通过展贸平台为涉老企业抢占市场先机&#xff0c;对企业营销策略、宣传影响力、定位产品…

apt-fast 使用

apt-fast 使用1. 安装2. 使用默认的apt-get install&#xff0c;有时下载会非常的慢&#xff0c;尤其是安装的一些ppa包的时候。apt-fast 通过使用多线程来给apt提速&#xff0c;极大地提高了效率。 1. 安装 添加ppa仓库 sudo add-apt-repository ppa:apt-fast/stable 更新软…

CAPL学习之路-测试功能集函数(约束和条件)

在test module和test unit中,可以添加事件对象或事件文本作为条件或约束。当事件发生时,条件或约束受损,测试报告中输出“Fail”条目,同时测试用例判定为“Fail” 此类函数有: TestAddCondition/TestAddConstraint,添加事件对象或事件文本作为条件或约束。不管是作为条件…

傻白入门芯片设计,如何写一篇好文章(十八)

目录 一、标题Title 如何看浩如烟海的文献&#xff1f; 二、摘要Abstract 三、介绍Introduction &#xff08;1&#xff09;“六句扩展法” &#xff08;2&#xff09;常见的逻辑&#xff1a; &#xff08;3&#xff09;更好的逻辑&#xff1a; 四、相关工作Related wo…

《CSAPP》笔记——系统级IO、网络编程、并发编程

文章目录传送门系统级IOUnix输入和输出Unix文件Unix文件操作Unix管理打开文件打开文件流程文件共享重定向文件标准IO标准IO流标准IO的缓冲机制RIO&#xff08;Robust IO&#xff09;对比与总结网络编程历史从头构建互联网网络层次以太网段网桥连接的以太网段互联网网络协议互联…

远程代码执行渗透与攻防(一)

目录 前言 远程代码执行&#xff1a;Remote Code Execute 远程命令执行&#xff1a;Remote Command Execute 为什么要远程执行代码&#xff1f; 漏洞危害 近几年影响比较大的RCE漏洞 PHP RCE涉及函数 代码code注入&#xff1a; 命令command注入 &#xff1a; 靶场案…

Word控件Spire.Doc 【评论】教程(4):C#、VB.NET如何在Word的评论中插入图片

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

认真学习MySQL中锁机制(二)

接上文认真学习MySQL中锁机制&#xff08;一&#xff09;我们继续学习MySQL中的锁机制。 【5】按加锁的方式划分&#xff1a;显示锁、隐式锁 ① 隐式锁 一个事务在执行insert操作时&#xff0c;如果即将插入的间隙已经被其他事务加了gap锁&#xff0c;那么本次insert操作会阻…

分类算法KNN的python实现

作者&#xff1a;刘凡 KNN算法介绍 KNN算法是有监督学习中的分类算法&#xff0c;它是一种非参的&#xff0c;惰性的算法模型。非参的意思并不是说这个算法不需要参数&#xff0c;而是意味着这个模型不会对数据做出任何的假设&#xff0c;与之相对的是线性回归&#xff08;我…