当前位置: 首页 > news >正文

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语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例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分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示&#xff1a; (图中是只设置了20次迭代的预测结果&#xff0c;宽度较宽&#xff0c;可自行修改迭代参数&#xff0c;获取更窄的预测区间&#xff09; 注&am…...

Java 分支结构 - if…else/switch

顺序结构只能顺序执行&#xff0c;不能进行判断和选择&#xff0c;因此需要分支结构。 Java有两种分支结构&#xff1a; if语句switch语句 if语句 一个if语句包含一个布尔表达式和一条或多条语句。 语法 If 语句的用语法如下&#xff1a; if(布尔表达式) {//如果布尔表达…...

【Unity每日一记】如何从0到1将特效图集制作成一个特效

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

磁力链接的示例与解释

磁力链接&#xff08;Magnet URI scheme&#xff09;是一种特殊类型的统一资源标识符&#xff08;URI&#xff09;&#xff0c;它包含了通过特定散列函数&#xff08;如SHA-1&#xff09;得到的文件内容的散列值&#xff0c;而不是基于位置或名称的引用。这使得磁力链接成为在分…...

云存储中常用的相同子策略的高效、安全的基于属性的访问控制的论文阅读

参考文献为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的调优 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马…...

第十四届蓝桥杯省赛大学C组(C/C++)三国游戏

原题链接&#xff1a;三国游戏 小蓝正在玩一款游戏。 游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z&#xff08;一开始可以认为都为 0&#xff09;。 游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时…...

java之static详细总结

static也叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量 按照有无static分为两种&#xff1a; 类变量&#xff1a;static修饰&#xff0c;属于类&#xff0c;与类一起加载一次&#xff0c;在内存中只有一份&#xff0c;会被类的全部对象共享实例变量&#xff08;…...

RabbitMQ3.13.x之六_RabbitMQ使用场景

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

C++ 类和对象(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…...

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Spring Boot Actuator

概述 Spring Boot Actuator是Spring Boot的一个功能模块&#xff0c;用于提供生产环境中常见的监控和管理功能。它提供了各种端点&#xff08;endpoints&#xff09;&#xff0c;可以用于监视应用程序的运行状况、收集应用程序的指标数据以及与应用程序进行交互。 以下是Spri…...

我与C++的爱恋:类与对象(一)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&…...

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…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...