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调试器 解决?】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

太阳能光伏电子实验酸洗用PFA方槽耐受强酸碱耐高温

PFA清洗槽是四氟清洗桶后的升级款,主要用于半导体光伏光电等行业,一体成型,无需担心漏液,表面光滑无毛刺。 别名PFA浸泡桶、PFA酸缸、PFA方槽等,可定制尺寸,可配套盖子,盖子有PFA/PTFE两种材质…

uniapp:聊天消息列表(好友列表+私人单聊)支持App、H5、小程序

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 文章简介(效果图展示&#xff…

【SQL】1890. 2020年最后一次登录(简单写法;窗口函数写法)

前述 sql 中 between 的边界问题 ---- between 边界:闭区间,not between 边界:开区间 在 sql 中, between 边界:闭区间not between 边界:开区间 题目描述 leetcode题目:1890. 2020年最后一…

LC 235.二叉搜索树的最近公共祖先

235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大&…

量身定制:选择能够解决企业问题的六西格玛培训机构

现在的培训机构太多了,都在打着六西格玛管理的旗号,甚至有很多培训机构连六西格玛管理都没有学习过,就敢号称自己是六西格玛管理专家。在这个鱼龙混杂的市场上,很多企业对于选择什么样的培训机构,以及如何选择一家靠谱…

【话题】如何看待那些速成并精通软件书籍的神器

大家好,我是全栈小5,欢迎阅读小5的系列文章,这是《话题》系列文章 目录 背景1. 神话与现实1.1 理论与实践之间的鸿沟1.2 一劳永逸的错觉 2. 速成书籍的优势与局限2.1 优势:2.2 局限: 3. 如何有效利用速成书籍3.1 量力而…

第十二天--二维数组的彻底解刨--地址

1.二维数组我们用父子的地址来称呼二维数组的地址 比如arr[3][4] 这里的arr是二维数组的首地址,也是父数组的首地址,也是子数组的首地址 arr1父数组的地址偏移1,实际上是偏移了4*416个字节 arr[0]是子数组的首地址,arr[0]1是子数…

Ubuntu22.04安装Anaconda

一、下载安装包 下载地址:https://www.anaconda.com/download#Downloads 参考:Ubuntu下安装Anaconda的步骤(带图) - 知乎 下载Linux 64-Bit (x86) installer 二、安装 在当前路径下,执行命令: bash Ana…

Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066

很奇怪的问题,在使用nifi的时候碰到的,这里是用NIFI,把数据从postgresql中同步到mysql中, 首先postgresql中的源表,中是没有create_time这个字段的,但是同步的过程中报错了. 报错的内容是说,目标表中有个create_time字段,这个字段是必填的,但是传过来的flowfile文件中,的数据没…

智过网:一建继续教育,操作指南与周期解析

随着社会的快速发展和技术的不断更新,建筑行业对从业人员的专业素质要求也在逐步提高。为了确保一级建造师的专业技能能够与时俱进,满足行业发展的需求,继续教育成为了必不可少的环节。本文将详细解析一建继续教育的操作流程及其周期安排&…

洛谷 1126.机器人搬重物

思路:BFS 这道BFS可谓是细节爆炸,对于编程能力和判断条件的能力的考察非常之大。 对于这道题,我们还需要额外考虑一些因素,那就是对于障碍物的考虑和机器人方位的考虑。 首先我们看第一个问题,就是对于障碍物的考虑…

基于单片机放大电路程控放大特性参数设计

**单片机设计介绍,基于单片机放大电路程控放大特性参数设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机放大电路程控放大特性参数设计是一个结合了单片机编程和放大电路技术的综合性项目。以下是对该设计项目的概…

Dapr(三) Dapr核心组件的使用一

结合前两期 Dapr(一) 基于云原生了解Dapr(Dapr(一) 基于云原生了解Dapr-CSDN博客) Dapr(二) 分布式应用运行时搭建及服务调用(Dapr(二) 分布式应用运行时搭建及服务调用-CSDN博客) 下篇推出dapr服务注册与发现,dapr组件绑定,dapr Actor功能。 目录 1.…

LVGL可视化设计-Gui Guider

(提示:本篇编辑状态中,完成了70%左右,争取4-8前完成) 一、Gui Guider 概述 免费!免费!免费!支持 LVGL v7、 v8.3很方便的:安装、使用 (另一种主流的visual studio模拟,省…

#pragma once的作用

使用visual studio新建头文件时,第一行会出现如下默认代码, #pragma once 它是一种编译器指令,通常用于确保头文件只被包含一次,以避免产生重复定义的问题。当编译器处理一个源文件时,遇到#pragma once指令时&#xf…

【Python】数据挖掘与机器学习(一)

【Python】数据挖掘与机器学习(一) 大家好 我是寸铁👊 总结了一篇【Python】数据挖掘与机器学习(一)sparkles: 喜欢的小伙伴可以点点关注 💝 【实验1】预测鲍鱼年龄 问题描述 请从一份数据中预测鲍鱼的年龄,数据集在abalone.cvs中&#xff…

SAP-SD VFX3释放销售订单发票报错:科目确定错误

VFX3 报错截图: VF03 - 检查发票信息 VKOA - 科目确定配置 核对是否有配置相应科目 以上~~

c++11 标准模板(STL)本地化库 - 平面类别 - (std::ctype) 定义字符分类表(六)

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 定义字符分类表 std::ctype template< class CharT > clas…

五款开放式蓝牙耳机推荐:这些宝藏耳机,你值得拥有!

如果你是长时间佩戴耳机的用户&#xff0c;那不入耳佩戴的开放式耳机可以让你彻底的“解放双耳”&#xff0c;长时间佩戴也不会觉得耳朵闷、耳朵疼&#xff1b;如果你是运动、健身爱好者&#xff0c;那通透、开放听感的开放式耳机可以提高你在运动时的安全性&#xff0c;让你在…

相位导数方差计算-matlab

%% 下面计算 相位导数方差% 假设 phase_map 是你的相位图二维矩阵 % K 是窗口的大小 k 3; % 请使用实际的窗口大小替换% 计算 x 和 y 方向的偏导 [dx, dy] gradient(wrappedPhase); Ksq k^2; % 计算 K^2half_k floor(k / 2);% 初始化结果矩阵 result zeros(size(wrappedPh…