Linux下Qt生成程序崩溃文件
文章目录
- 1.背景
- 2.Qt编译生成程序
- 2.1.profile模式的本质
- 3.执行程序,得到core文件
- 4.代码定位
- 4.1.直接使用gdb
- 4.2.使用QtCreator
- 5.总结
- 6.题外话
- 6.1.profile模式和debug模式的区别
1.背景
在使用Qt时,假如在windows,当软件崩溃时,可以利用生成dmp文件来查找软件崩溃的原因及原因出现的位置(在源码的哪一行)。具体可以看看我这篇博客:【Qt下生成pdb文件,并在exe崩溃时生成dmp文件,且由dmp查询崩溃原因】;
但是在linux下,要生成dmp文件貌似很麻烦,要用到google的BreakPad【Qt Linux系统使用QBreakpad实战】。
有没有方便一点的方法呢?
其实有的,linux下原生支持一种定位软件崩溃的方式:core dump。
2.Qt编译生成程序
建立一个简单的程序,并写一段空指针导致崩溃的程序
选择profile模式进行编译:
2.1.profile模式的本质
选择profile模式进行编译时,除了生成一个以项目名字命名的可执行程序外,还会生成一个以项目名字+.debug命名的文件。
这个文件不是可执行文件,而是一个调试信息文件,里面的信息会辅助程序在崩溃时保存当时的堆栈、变量值等。
关于这个*.debug文件的生成,我们还可以从Qt的编译输出窗口了解到一些信息:
首先,g++在编译时是加了-g选项,表示在编译时把调试信息编译进去(相当于debug模式?)
然后再看这一行:
objcopy --only-keep-debug untitled1 untitled1.debug && objcopy --strip-debug untitled1 && objcopy --add-gnu-debuglink=untitled1.debug untitled1 && chmod -x untitled1.debug
这里用到一个关键命令:objcopy,关于这个工具的用法,可以查看【GNU objcopy命令的探索:(转换二进制文件)】
可以看到上面这个语句分为四部分,依次执行:
- objcopy --only-keep-debug untitled1 untitled1.debug
使用objcopy工具来创建一个调试信息副本。–only-keep-debug选项告诉objcopy只保留调试信息而不进行其他任何操作。untitled1是原始的目标文件,而untitled1.debug是生成的只包含调试信息的文件。 - objcopy --strip-debug untitled1
这一行再次使用objcopy,但这次是去除目标文件untitled1中的调试信息。–strip-debug选项会移除所有的调试信息,使得目标文件更小,运行速度可能更快,但这样会使得调试变得更加困难。 - objcopy --add-gnu-debuglink=untitled1.debug untitled1
这一行又用objcopy来重新添加一个GNU风格的调试链接到untitled1可执行文件中。–add-gnu-debuglink=后面跟着的untitled1.debug是之前保留的调试信息文件。这样,即使调试信息被剥离,执行文件中仍然有一个指向原始调试信息的链接,可以在调试时恢复调试信息。 - chmod -x untitled1.debug
最后一行使用chmod命令改变untitled1.debug文件的权限,使得这个文件不可执行。-x选项表示移除执行权限。
总的来说,这四段命令的目的是对原可执行文件优化(去除调试信息)后,仍然能够恢复和执行原始的调试信息,以便于后续的调试工作。
3.执行程序,得到core文件
将编译出来的两个文件拷贝到一个单独的文件夹(目的是避嫌,测试在空白环境能不能运行)
然后在此文件夹打开控制台(或者打开控制台后cd到这个文件夹)
执行两个语句(这两个语句的作用可以查看这里【Linux生成core文件相关配置,core文件调试示例】)
ulimit -c 4096
sudo sysctl kernel.core_pattern=%e.core
然后执行程序
./untitled1
可以看到,生成了core文件(不知道为啥.code后面还加了个数字)
4.代码定位
在得到core文件后,假如想要知道到底是哪一行代码导致了程序崩溃,有两种方式:
4.1.直接使用gdb
gdb untitled1 untitled1.core.9305
可以看到,崩溃的地方被显示出来了。
还可以把这个ptr运行时的值打印出来
print ptr
4.2.使用QtCreator
选择Debug–》Start Debugging–》Load Core File
在弹窗中选择刚才的core文件,选好后,可执行文件会自动填充。然后点击ok。
然后就可以调试了:
同样定位到了正确的代码处,并且还把当时的各个变量的值直接显示出来。
所以这种方式应该是比较适合咱们这种一般人。
5.总结
Linux下程序的崩溃文件生成相对于Windows下还方便一点(Windows下还得自己保存dmp文件),可能各有千秋吧。
暂时还没试过在A电脑编译程序,然后放到B电脑运行产生core文件,然后再拿回A电脑进行代码定位。有空的话得测试一下。
6.题外话
6.1.profile模式和debug模式的区别
我们直接把这两种的编译语句拿出来对比一下
这是debug的: g++ -c -pipe -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../untitled1 -I. -I/opt/Qt/5.15.2/gcc_64/include -I/opt/Qt/5.15.2/gcc_64/include/QtWidgets -I/opt/Qt/5.15.2/gcc_64/include/QtGui -I/opt/Qt/5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I. -I/opt/Qt/5.15.2/gcc_64/mkspecs/linux-g++ -o main.o ../untitled1/main.cpp
这shiprofile的: g++ -c -pipe -O2 -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../untitled1 -I. -I/opt/Qt/5.15.2/gcc_64/include -I/opt/Qt/5.15.2/gcc_64/include/QtWidgets -I/opt/Qt/5.15.2/gcc_64/include/QtGui -I/opt/Qt/5.15.2/gcc_64/include/QtCore -I. -I/usr/include/libdrm -I. -I/opt/Qt/5.15.2/gcc_64/mkspecs/linux-g++ -o main.o ../untitled1/main.cpp
对比一下可以看到,主要是在profile下,多了 -O2 -DQT_NO_DEBUG这两个选项。
-O2:进行代码优化、优化等级为2;具体请查阅相关资料。
-DQT_NO_DEBUG:这个应该是个编译定义、编译选项?当出现这个定义时,一部分Qt代码将不会被编译到可执行文件中?假如这个定义是在链接库时生效的,还可以在编译时对库里面的代码进行选择?库里面的代码不是在编程这个库时就已经决定了吗,宏定义不是预编的一种吗?既然是预编译,那么对于一个库来收,在正式编译前,代码已经通过预编译进行了选择吧,为何再加-DQT_NO_DEBUG还有用?
-DQT_NO_DEBUG:这表示在编译时添加一个宏定义,和在代码中增加 #define QT_NO_DEBUG的效果一样。之所以加这个,是因为在Qt的头文件中,有很多地方都利用到了这个宏定义。加了这个定义后,Qt会相应地做了一些优化。
参考:
【Linux生成core文件相关配置,core文件调试示例】
【【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?】
相关文章:

Linux下Qt生成程序崩溃文件
文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序,得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时,假如在windows,当软件崩溃时,…...
Go语言中测试和性能
1. 测试:软件开发最重要的方面 测试软件程序可能是软件开发人员能够做的最重要的事情。通过测试代码的功能,开发人员能够在很大程度上确定程序是有效的。另外,每次修改代码后,开发人员都可运行测试,确认没有引入Bug和衰退。通过测试软件,还能够让软件工程师确认程序按期望…...

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测
回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于CPO-GPR基于冠豪猪算法优化高斯…...

python 日期字符串转换为指定格式的日期
在Python编程中,日期处理是一个常见的任务。我们经常需要将日期字符串转换为Python的日期对象,以便进行日期的计算、比较或其他操作。同时,为了满足不同的需求,我们还需要将日期对象转换为指定格式的日期字符串。本文将详细介绍如…...

day03-Docker
1.初识 Docker 1.1.什么是 Docker 1.1.1.应用部署的环境问题 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题: 依赖关系复杂,容易出现兼容性问题开发、测试、生产环境有差异 例如一个项目中,部署时需要依…...

C语言函数实现冒泡排序
前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧,我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…...

区间概率预测python|QR-CNN-BiLSTM+KDE分位数-卷积-双向长短期记忆神经网络-时间序列区间概率预测+核密度估计
区间预测python|QR-CNN-BiLSTMKDE分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示: (图中是只设置了20次迭代的预测结果,宽度较宽,可自行修改迭代参数,获取更窄的预测区间) 注&am…...
Java 分支结构 - if…else/switch
顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构。 Java有两种分支结构: if语句switch语句 if语句 一个if语句包含一个布尔表达式和一条或多条语句。 语法 If 语句的用语法如下: if(布尔表达式) {//如果布尔表达…...

【Unity每日一记】如何从0到1将特效图集制作成一个特效
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
磁力链接的示例与解释
磁力链接(Magnet URI scheme)是一种特殊类型的统一资源标识符(URI),它包含了通过特定散列函数(如SHA-1)得到的文件内容的散列值,而不是基于位置或名称的引用。这使得磁力链接成为在分…...

云存储中常用的相同子策略的高效、安全的基于属性的访问控制的论文阅读
参考文献为2022年发表的Efficient and Secure Attribute-Based Access Control With Identical Sub-Policies Frequently Used in Cloud Storage 动机 ABE是实现在云存储中一种很好的访问控制手段,但是其本身的计算开销导致在实际场景中应用收到限制。本论文研究了一种LSSS矩…...

JVM高级篇之GC
文章目录 版权声明垃圾回收器的技术演进ShenandoahShenandoah GC体验Shenandoah GC循环过程 ZGCZGC简介ZGC的版本更迭ZGC体验&使用ZGC的参数设置ZGC的调优 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马…...
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
原题链接:三国游戏 小蓝正在玩一款游戏。 游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z(一开始可以认为都为 0)。 游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时…...

java之static详细总结
static也叫静态,可以修饰成员变量、成员方法。 成员变量 按照有无static分为两种: 类变量:static修饰,属于类,与类一起加载一次,在内存中只有一份,会被类的全部对象共享实例变量(…...

RabbitMQ3.13.x之六_RabbitMQ使用场景
RabbitMQ3.13.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.13.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ?1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ? RabbitMQ 是一个可靠且…...

C++ 类和对象(初篇)
类的引入 C语言中,结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式: class className {// 类体:由成员函…...

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Spring Boot Actuator
概述 Spring Boot Actuator是Spring Boot的一个功能模块,用于提供生产环境中常见的监控和管理功能。它提供了各种端点(endpoints),可以用于监视应用程序的运行状况、收集应用程序的指标数据以及与应用程序进行交互。 以下是Spri…...

我与C++的爱恋:类与对象(一)
🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象&…...
os模块篇(十八)
文章目录 os._exit(n)os.forkpty()os.kill(pid, sig, /)os.killpg(pgid, sig, /)os.nice(increment, /)os.pidfd_open(pid, flags0)os.plock(op, /)os.popen(cmd, moder, buffering-1)os.posix_spawn(path, argv, env, *, file_actionsNone, setpgroupNone, resetidsFalse, set…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...