C++(Qt)软件调试---linux使用dmesg定位程序崩溃位置(14)
C++(Qt)软件调试—linux使用dmesg定位程序崩溃位置(14)
文章目录
- C++(Qt)软件调试---linux使用dmesg定位程序崩溃位置(14)
- 1、前言
- 2、ELF文件
- 3、常用工具
- 4、使用dmesg定位异常位置
- 1.1 异常发生在可执行程序中
- 1.2 异常发生在动态库中
1、前言
在我们日常开发中,经常会遇见程序崩溃退出的情况,一般在linux下我们可以通过生成core文件来进行调试,定位出现异常位置,但是如果我们忘记了生成core文件或者程序在用户机器上运行没有生成core,就无法通过调试core文件定位异常,这时就可以使用dmesg中的信息帮助调试。
- 不同的系统中dmesg可能存在差异,例如在麒麟系统中我就没有发现在程序崩溃后的dmesg日志;
- 测试系统:ubuntu20.04
2、ELF文件
ELF(Executable and Linkable Format)是一种通用的二进制文件格式,主要用于在Unix和Linux系统中存储可执行程序、共享库、目标文件等。下面是对ELF文件的详细说明:
-
文件头(File Header):
- ELF文件以一个固定大小的文件头开始,包含了文件的基本信息,如文件类型、目标体系结构、入口点地址等。
-
程序头表(Program Header Table):
- 程序头表是一个表格,其中包含了关于ELF文件中各个程序段(段是一种内存分配单位)的描述信息,如段的类型、文件偏移、虚拟内存地址、大小等。
-
节头表(Section Header Table):
- 节头表包含了有关ELF文件中各个节(段内的逻辑分区,例如代码段、数据段)的描述信息,包括名称、类型、大小、偏移等。
.init(_init):init节通常指的是程序的初始化代码段,它是程序执行的起点,init节的入口点是程序的起始地址,也就是操作系统将开始执行的地方。这个入口点通常是可执行文件的文件头中指定的地址。- .text(代码节):这个节包含了程序的机器代码指令,即可执行代码部分。它是可执行文件中最重要的节之一。
- .data(数据节):数据节包含程序中的全局和静态变量,以及初始化的全局和静态变量的数据值。这些数据可以在程序的整个生命周期中被访问和修改。
- .rodata(只读数据节):这个节包含只读的数据,通常是常量、字符串字面值等。这些数据不能在运行时被修改。
- .bss(未初始化数据节):该节包含全局和静态变量的未初始化数据,也就是说,它们在程序加载时不会被初始化,而是在运行时初始化为零或空值。
- .plt(Procedure Linkage Table):用于延迟绑定动态链接的节,主要用于共享库。
- .got(Global Offset Table):全局偏移表包含了用于动态链接的全局变量和函数的地址。
- .debug(调试信息节):包含了调试信息,如符号表、源代码映射等,有助于调试和分析程序。
- .textrel(重定位节):包含了代码中需要进行动态重定位的信息,用于处理位置无关代码。
- .comment(注释节):包含了关于程序的注释信息,通常不会影响程序的执行。
- .strtab(字符串表节):包含了节名、符号名等字符串的表格,用于字符串的索引和查找。
- 节头表包含了有关ELF文件中各个节(段内的逻辑分区,例如代码段、数据段)的描述信息,包括名称、类型、大小、偏移等。
-
段数据(Section Data):
- ELF文件包含了各种段,其中包括代码段、数据段、只读段、只写段等,这些段包含了程序的实际数据和指令。
-
符号表(Symbol Table):
- 符号表存储了程序中定义和引用的符号(如函数和变量)的信息,包括符号名称、地址、大小等。它在调试和链接过程中非常有用。
-
重定位表(Relocation Table):
- 重定位表包含了需要在链接时进行地址修正的信息,以确保程序正确地在内存中加载和执行。
-
动态链接信息(Dynamic Linking Information):
- 如果ELF文件支持动态链接(共享库),则包含了动态链接信息,包括共享库的名称和相关信息。
-
字符串表(String Table):
- 字符串表存储了各种字符串,如符号名称、段名称等,这些字符串可以通过索引在ELF文件中引用。
-
版本信息(Version Information):
- 如果文件支持版本控制,包含了与版本相关的信息,以便在动态链接时选择正确的共享库版本。
-
其他信息:
- ELF文件还可以包含其他特定于目标体系结构和应用程序的信息,如程序入口点、对齐要求、文件权限等。
3、常用工具
- file:查看文件基本信息。
- ldd:查看一个可执行文件或共享库文件所依赖的动态链接库。
- nm:用于查看二进制可执行文件或共享库中符号信息的工具。
- strings :用于从二进制文件中提取可打印的字符序列,通常用于查找文件中的文本。
- strip:用于去除可执行文件中的符号表信息的 Linux 命令。
- readelf:显示有关ELF文件的信息。
- objdump:用于查看和分析可执行文件、目标文件和共享库的工具,通常与GNU Binutils一起提供。它能够提供有关这些文件的详细信息,包括程序代码、数据段、符号表、重定位表等等。
- netstat:用于显示网络连接、路由表、接口统计、Masquerade 连接等网络相关信息的命令行工具。
- ps:用于显示当前系统的进程信息。
- top/htop:用于监视系统进程的命令行工具,通常在Unix和类Unix系统中使用。它提供了关于系统中运行的进程的实时信息,包括CPU使用率、内存使用率、进程列表以及其他系统性能相关的信息。
- dmesg:用于查看和分析Linux操作系统内核消息的命令。它提供了有关系统启动、硬件检测、设备驱动程序加载和内核错误等信息的详细报告。
- addr2line:将地址转换为文件名和行号。
- tcpdump:一个强大的网络抓包工具,用于捕获和分析网络数据包。
4、使用dmesg定位异常位置
-
测试程序:C++、Qt
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_pushButton_clicked() {QWidget* w = nullptr; // w->show(); // 异常发生在动态库中int* a = nullptr;*a = 10; // 异常发生在可执行程序中}
1.1 异常发生在可执行程序中
-
执行程序并出现崩溃;
-
使用dmesg命令查看程序异常日志(有时需要使用sudo dmesg);
[44741.877559] untitled4[14899]: segfault at 0 ip 00005598c5d3b8e4 sp 00007ffd7505a2b8 error 6 in untitled4[5598c5d3b000+1000] [44741.877582] Code: ff ff ff 48 89 ef be 38 00 00 00 5d e9 c5 f9 ff ff 0f 1f 44 00 00 f3 0f 1e fa 48 83 ef 10 eb d6 66 0f 1f 44 00 00 f3 0f 1e fa <c7> 04 25 00 00 00 00 00 00 00 00 0f 0b 66 2e 0f 1f 84 00 00 00 00- untitled4[14899]:出现异常的程序和进程号;
- segfault at [地址]: segfault发生的内存地址。
- ip [指令指针地址]: 引起segfault的指令指针在虚拟内存中的地址。
- sp [栈指针地址]: 引起segfault的栈指针的地址。
- error [错误代码]: segfault的错误代码,通常以非零值表示错误。
- in [发生异常的文件] [文件加载进内存首地址+偏移量]: 引起segfault的二进制文件的路径和函数名称。
-
这里会用到两类地址;
- 内存地址: 内存地址是指计算机内存中的物理地址或虚拟地址,用于在运行时定位程序的指令、数据和堆栈等内容。内存地址是动态的,会随着程序的执行而变化,特别是在使用虚拟内存的系统中,操作系统会将内存地址映射到物理内存或磁盘上。内存地址是程序在运行时实际使用的地址,它们与物理内存或虚拟内存中的存储位置相对应。dmesg中记录的就是程序崩溃时指令指针在内存中的地址;
- 可执行文件中的地址: 可执行文件中的地址是编译后的程序的内部地址空间,通常用于编译器和链接器在构建可执行文件时确定代码、数据和符号的相对位置。这些地址在编译时和链接时分配,并在可执行文件中保存。它们通常是相对地址,用于在可执行文件内部定位数据和指令。可执行文件中的地址是静态的,不会随程序的执行而改变。
-
所以要使用dmesg的地址定位异常位置就需要将内存地址转换为可执行文件中的地址;
-
由于
init节的入口点是程序的起始地址,所以文件中的地址 = 指令指针地址 - 文件加载进内存首地址 + init节地址;-
可通过nm命令或者 objdump -p命令查看init节地址 ;

-
00005598c5d3b8e4 - 5598c5d3b000 + 3000 = 38E4 -
使用
addr2line -e 可执行程序 地址 -Cfi就可如下图所示得到出现异常的函数和所在文件、在文件中的行号。
-
注意:如果是使用Release模式编译的不包含调试符号则只能看到出现异常的函数,不能具体到文件和行号。

-
1.2 异常发生在动态库中
-
当异常出现在动态库中是dmesg日志信息如下所示;
[47072.125853] untitled4[15938]: segfault at 28 ip 00007f885dca8f7e sp 00007ffe035bc640 error 4 in libQt5Widgets.so.5.12.5[7f885db0e000+61d000] [47072.125882] Code: 48 89 df be 01 00 00 00 5b 48 8b 40 68 ff e0 90 66 90 66 2e 0f 1f 84 00 00 00 00 00 48 8b 05 b1 ec 6a 00 53 48 89 fb 48 8b 38 <48> 8b 43 28 8b 70 0c 48 8b 07 ff 90 a8 00 00 00 83 f8 04 74 2d 83 -
由于可执行程序和动态库的堆栈是相互独立的,并不是在同一个堆栈,所以当异常出现在动态库中时dmesg日志信息中的地址是动态库在内存中的地址;
-
所以
文件中的地址 = 指令指针地址 - 文件加载进内存首地址; -
00007f885dca8f7e - 7f885db0e000 = 19AF7E -
使用
ldd查看动态库路径;
-
使用
addr2line -e 动态库 地址 -Cfi就可如下图所示得到出现异常的函数和所在文件、在文件中的行号。
{__/}
(̷ ̷´̷ ̷^̷ ̷`̷)̷◞~❤
| ⫘ |
相关文章:
C++(Qt)软件调试---linux使用dmesg定位程序崩溃位置(14)
C(Qt)软件调试—linux使用dmesg定位程序崩溃位置(14) 文章目录 C(Qt)软件调试---linux使用dmesg定位程序崩溃位置(14)1、前言2、ELF文件3、常用工具4、使用dmesg定位异常位置1.1 异常发生在可执行程序中1.2 异常发生在动态库中 1、…...
38 WEB漏洞-反序列化之PHPJAVA全解(下)
目录 Java中的API实现序列化和反序列化演示案例WebGoat_Javaweb靶场反序列化测试2020-网鼎杯-朱雀组-Web-think java真题复现 文章参考: https://www.cnblogs.com/zhengna/p/15737517.html https://blog.csdn.net/MCTSOG/article/details/123819548 ysoserial生成攻…...
LeetCode 面试题 10.10. 数字流的秩
文章目录 一、题目二、C# 题解 一、题目 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入一个数字都会调…...
Vue3项目上线打包优化
之前整理过 Vue2项目上线打包优化,在vue3中,使用vite打包,配置稍微改了改。 1 开启gzip压缩 1.1 安装依赖 npm i vite-plugin-compression -D1.2 vite.config.ts 配置 import viteCompression from vite-plugin-compressionexport defaul…...
【算法题】2525. 根据规则将箱子分类
题目: 给你四个整数 length ,width ,height 和 mass ,分别表示一个箱子的三个维度和质量,请你返回一个表示箱子 类别 的字符串。 如果满足以下条件,那么箱子是 “Bulky” 的: 箱子 至少有一个…...
python字典
字典 字典定义创建字典 字典定义 字典是python语言中唯一的映射类型。这种映射类型由键(key)和值(value)组成,是“键值对”的无序可变序列 定义字典时,每个元组的键和值用冒号隔开,相邻元素用…...
thinkphp队列的使用?
1.安装队列依赖 由于框架版本原因可以选择适合的版本 composer require topthink/think-queue 由于我是tp框架5.1的,所以选择了think-queue 1.1.6 composer require topthink/think-queue 1.1.6 判断安装成功 php think queue:work -h image.png 2.配置文件…...
【数据结构】排序--归并排序
目录 一 基本思想 二 代码实现 三 非递归归并排序 一 基本思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并ÿ…...
批量修改视频尺寸:简单易用的视频剪辑软件教程
如果你需要批量修改视频尺寸,同时保持高质量的画质,那么“固乔剪辑助手”这款软件是你的不二之选。下面就是如何使用这款软件进行批量修改视频尺寸的详细步骤。 1. 首先,你需要在浏览器中进入“固乔科技”的官网,然后下载并安装“…...
四川云汇优想:短视频矩阵运营方案
短视频矩阵运营方案是为了提高短视频平台的用户黏性和活跃度,从而增强用户粘性和平台的商业价值而制定的。下面四川百幕晟小编将对短视频矩阵运营方案进行详细的介绍和分析。 首先,短视频矩阵运营方案要注重用户精细化运营。通过用户画像和兴趣标签&…...
vue中如何获取到当前位置的天气
要在Vue中获取当前位置的天气,您需要使用浏览器的Geolocation API来获取设备的地理位置,并使用第三方的天气API来获取天气数据。 下面是一般的步骤: 在Vue项目中安装axios库,用于发送HTTP请求。 npm install axios 创建一个新的…...
C++三角函数和反三角函数
当涉及到三角函数和反三角函数时,C提供了一组函数来执行这些计算。以下是C中常用的三角函数和反三角函数的详细解释和示例说明: sin函数(正弦函数): 函数原型:double sin(double x);功能:计算给…...
Linux篇 五、Ubuntu与Linux板卡建立NFS服务
Linux系列文章目录 一、香橙派Zero2设置开机连接wifi 二、香橙派Zero2获取Linux SDK源码 三、香橙派Zero2搭建Qt环境 四、Linux修改用户名 文章目录 Linux系列文章目录前言一、连接到局域网互ping测试 二、安装NFS服务配置NFS更新exports配置三、板卡安装NFS客户端四、板卡临时…...
通讯协议学习之路:IrDA协议协议理论
通讯协议之路主要分为两部分,第一部分从理论上面讲解各类协议的通讯原理以及通讯格式,第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN;视频会发布在bilibili(UID:399951374) 序、…...
互联网摸鱼日报(2023-10-20)
互联网摸鱼日报(2023-10-20) 博客园新闻 OPPO让折叠机超越直板旗舰成为可能 特斯拉的“大空头”,是马斯克那张嘴 逃避内卷的年轻人,盯上了老年大学的音乐课 理想市值超蔚来1倍,一场属于增程式的胜利 补足折叠屏影像短板,OPPO…...
C/C++ 快速入门
参考:https://blog.csdn.net/gao_zhennan/article/details/128769439 1 下载Visual Studio Code并安装中文插件,此处不再叙述 2 插件安装C/C插件 3 使用快捷键【Ctr ~】打打开终端 验证并未安装编译器 4 我们即将使用【MinGW-64】做为编译器 https:…...
【Git】升级MacOS系统,git命令无法使用
终端执行git命令报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun安装这个东东,?需要42小时 最终解决: 下载安装 https…...
单点登录是什么?
单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。 单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session 中的ÿ…...
面向对象设计原则之依赖倒置原则
目录 定义原始定义进一步的理解 作用实现方法代码示例 面向对象设计原则之开-闭原则 面向对象设计原则之里式替换原则 面向对象设计原则之依赖倒置原则 面向对象设计原则之单一职责原则 定义 依赖倒置原则(Dependence Inversion Principle),…...
MATLAB——概率神经网络分类问题程序
欢迎关注“电击小子程高兴的MATLAB小屋” %% 概率神经网络 %% 解决分类问题 clear all; close all; P[1:8]; Tc[2 3 1 2 3 2 1 1]; Tind2vec(Tc) %数据类型的转换 netnewpnn(P,T); Ysim(net,P); Ycvec2ind(Y) %转换回来...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
