为二进制文件添加.gnu_debugdata调试信息

前言

在使用gcc/g++编译二进制文件过程中,如果添加了-g参数,编译出来的二进制文件会带有debug信息,供调试使用。但是debug信息往往占用空间很大,导致二进制文件太大,在发布到生产环境时,一般会去掉调试信息,以减小二进制文件大小。如此一来,在出现问题后就无法直接使用gdb调试工具进行调试了。一种可行的做法是版本发布时保留debug信息,出现问题后使用debug信息进行问题分析调试,但这种做法相对比较麻烦。mini debuginfo的技术提供了一种有效的解决思路。

mini debuginfo的思路是在二进制ELF文件中添加一个section(.gnu_debugdata),section中仅保留最少的调试信息(如:只保留可调试的函数符号),并对调试进行进行压缩,以尽可能地减少调试信息大小。

下面以一个实际例子说明如何给二进制文件添加该类型的section。

实例

我们以一个简单的例子开始,以下是该例子的代码:

#include <stdio.h>
int a;
void func1()
{
        a = 1;
}

void func2()
{
        int test;
        a = 2;
        test = a;
}

int main()
{
        func1();
        func2();
        printf("a is %d\n", a);
        return 0;
}

编译二进制文件

使用gcc命令将代码编译成二进制可执行文件:

gcc -g -o test_mini_debug test_mini_debug.c

保存要保留的符号信息

然后使用nm命令查看该二进制文件中的符号信息,其中--defined-only参数指定只关注定义的信息:

nm --defined-only test_mini_debug

二进制文件中有很多符号,我们调试时关心的主要是函数和变量信息,函数位于ELF二进制文件的.TEXT段中,即上图中第二列为T/t的符号;变量分全局变量和局部变量,全局变量位于.BSS段(未初始化的全局变量)或.DATA段(初始化的全局变量)中,即上图中第二列为B/b,D/d的符号,局部变量一般保存在寄存器或栈中,此处看不到。

我们将函数和全局变量保存到一个文件中,后续会使用到,命令如下:

nm --defined-only test_mini_debug |awk '{ if($2 == "T" || $2 == "t" || $2 == "B" || $2 == "b" || $2 == "D" || $2 == "d") print $3 }' > test_mini_debug.syms

生成mini debuginfo信息

在上一步中保存了我们要保留的符号信息,接下来就可以根据这些信息生成minidebug信息了。首先使用objcopy命令将上面的二进制文件的debug信息剥离出来:

objcopy --only-keep-debug test_mini_debug test_mini_debug.debug

然后,对debug信息进行瘦身,只保留我们关注的函数和全局变量信息:

objcopy -S --keep-symbols=test_mini_debug.syms test_mini_debug.debug test_mini_debug.mini_debuginfo

接着,使用xz命令对debug信息进行压缩,进一步减小debug信息大小:

xz test_mini_debug.mini_debuginfo

经过以上一番操作,debug信息从原来的6K减少到了1K左右:

对二进制文件进行瘦身

在上面的步骤中,我们将debug信息从二进制文件中剥离了出来,但是原来的二进制文件还存在debug信息,如下图,使用readelf查看,这些debug信息(以.debug开头的段)还在二进制文件中:

readelf -S test_mini_debug

要先将该部分信息删除,直接使用objcopy -S命令即可。

objcopy -S test_mini_debug

再次使用readelf命令查看,已经没有debug信息了:

将mini debuginfo添加到二进制文件中

最后一步,将我们之前生成的mini debuginfo信息添加到二进制文件中,命令如下:

objcopy --add-section .gnu_debugdata=test_mini_debug.mini_debuginfo.xz test_mini_debug

使用readelf命令查看,二进制文件中已经有.gnu_debugdata段了:

验证

使用gdb命令调试该二进制文件,可以看到,已能够识别函数和全局变量了。

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

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

相关文章

【分布式系统】ceph部署(命令+截图巨详细版)

目录 一.存储概述 1.单机存储设备 2.单机存储的问题 3.商业存储 4.分布式存储​编辑 4.1.什么是分布式存储 4.2.分布式存储的类型 二.ceph概述 1.ceph优点 2.ceph架构 3.ceph核心组件 4.OSD存储后端 5.ceph数据存储过程 6.ceph版本发行生命周期 7.ceph集群部署 …

Python爬虫:BeautifulSoup的基本使用方法!

1.简介 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供需要抓取的数据&#xff0c;因为简单&#xff0c;所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup…

js字符串文字添加不同颜色,replace的妙用$1...$9

更改字符串第一个数字为红色显示&#xff0c;第二个数字为黄色显示 $1匹配的是正则第一个括号选中的字符串&#xff0c;可以使用正则不断用括号匹配然后更改样式 const testStr "剩余12个名额&#xff0c;截止时间12月25日" testStr this.testStr.replace(/(\d)(\D…

GD32F303之CAN通信

1、CAN时钟 GD32F303主时钟频率最大是120Mhz,然后APB1时钟最大是60Mhz,APB2时钟最大是120Mhz,CAN挂载在APB1总线上面 所以一般CAN的时钟频率是60Mhz,这个频率和后面配置波特率有关 2、GD32F303时钟配置 首先我们知道芯片有几个时钟 HXTAL&#xff1a;高速外部时钟&#xff1…

[图解]SysML和EA建模住宅安全系统-14-黑盒系统规约

1 00:00:02,320 --> 00:00:07,610 接下来&#xff0c;我们看下一步指定黑盒系统需求 2 00:00:08,790 --> 00:00:10,490 就是说&#xff0c;把这个系统 3 00:00:11,880 --> 00:00:15,810 我们的目标系统&#xff0c;ESS&#xff0c;看成黑盒 4 00:00:18,030 --> …

软考:软件设计师 — 2.操作系统

二. 操作系统 1. 操作系统概念 &#xff08;1&#xff09;操作系统的作用 操作系统是计算机硬件之上的第一层软件系统。 操作系统通常用来&#xff1a; 管理系统的硬件、软件、数据资源。控制程序运行。人机之间的接口。应用软件与硬件之间的接口。 可概括为&#xff1a; …

汽车零配件行业看板管理系统应用

生产制造已经走向了精益生产&#xff0c;计算时效产出、物料周转时间等问题&#xff0c;成为每一个制造企业要面临的问题&#xff0c;工厂更需要加快自动化&#xff0c;信息化&#xff0c;数字化的布局和应用。 之前的文章多次讲解了企业MES管理系统&#xff0c;本篇文章就为大…

HybridCLR原理中的重点总结

序言 该文章以一个新手的身份&#xff0c;讲一下自己学习的经过&#xff0c;大家更快的学习HrbirdCLR。 我之前的两个Unity项目中&#xff0c;都使用到了热更新功能&#xff0c;而热更新的技术栈都是用的HybridCLR。 第一个项目本身虽然已经集成好了热更逻辑&#xff08;使用…

楼道灯微波雷达模块模组,智能感应uA级超低功耗替换红外传感器,飞睿助力绿色照明

随着科技的飞速发展&#xff0c;LED楼道灯早已不仅仅是照亮我们回家路的工具&#xff0c;它们正变得越来越智能、高效和环保。今天&#xff0c;就让我们一起探索LED楼道灯背后的科技——飞睿智能微波雷达模块模组&#xff0c;以及它如何以超低功耗&#xff08;uA级别&#xff0…

信息化安全管理怎么做

企业如何做好安全管理工作?检查频次多了怕影响子正常生产经营&#xff0c;效益低下&#xff0c;检查频次少了又担心管控不住。”这是安全管理部综合业务室的困惑&#xff0c;也是很多企业的困惑。面对企业在安全管理中的困惑与挑战&#xff0c;采用信息化平台与精细化管理策略…

强烈推荐!!李沐老师《动手学深度学习》最新Pytorch版!

动手学深度学习(PyTorch版)》是由李沐、Aston Zhang和孔德威共同编写的教材&#xff0c;专为深度学习初学者和实践者设计。本书使用PyTorch作为主要的深度学习框架&#xff0c;全面系统地介绍了深度学习的基本理论、常见模型和实际应用技巧。 书中内容包括深度学习的基础知识、…

华南师范大学“大学生校外实践教学基地”授牌仪式暨见习参观活动圆满结束

为促进校企合作的深入发展&#xff0c;培育出具有实际应用技能的人才&#xff0c;7月9日&#xff0c;华南师范大学数学科学院与广东泰迪智能科技股份有限公司联合开展“大学生校外实践教学基地”授牌仪式暨见习参观活动。华南师范大学数学科学院数据科学系主任陈艳男、副主任陈…

物联网实训室建设可行性报告

一、建设物联网实训室的目的和意义 随着信息技术的快速发展&#xff0c;物联网&#xff08;IoT&#xff09;已成为推动社会进步和经济发展的关键技术之一。物联网技术的集成应用&#xff0c;不仅能够提高生产效率&#xff0c;还能促进智慧城市、智能家居、智能农业等多个领域的…

企业网站源码系统 自主快速搭建响应式网站 海量模版随心选择 带完整的源代码包以及搭建教程

系统概述 企业网站源码系统&#xff0c;是一款专为中小企业量身定制的网站建设解决方案。该系统基于先进的Web开发技术&#xff0c;融合了模块化设计理念和用户友好的操作界面&#xff0c;旨在帮助企业用户无需编程基础&#xff0c;即可轻松搭建出符合自身需求的响应式网站。通…

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技推出一款创新的语料开发工具——星环语料开发工具TCS&#xff08;Transwarp Corpus Studio&#xff09;&#xff0c;旨在通过全面的语料生命周期管理&#xff0c;极大提升语料开发效率&#xff0c;助…

衣服、帽子、鞋子相关深度学习数据集大合集(2)

继续为大家分享关于衣帽鞋子的深度学习数据集&#xff0c;主要有衣服、帽子、鞋子、短裤、短袖、T恤等。 1、人头上带着各种帽子图片数据集 数据格式&#xff1a;图片 是否标注&#xff1a;已标注 标注格式&#xff1a;yolov8 图片数量&#xff1a;1853张 数据查看地址&a…

捷配生产笔记-细间距芯片的表面处理工艺:OSP与沉金工艺的重要性

在现代电子制造领域&#xff0c;随着技术的进步&#xff0c;电子设备变得越来越小型化和高性能化。细间距芯片作为实现这一目标的关键组件&#xff0c;其制造工艺要求极为严格。在这些要求中&#xff0c;表面处理工艺尤为关键&#xff0c;因为它直接影响到芯片的焊接质量和长期…

叉车司机疲劳检测系统解决方案

在日益繁忙的物流仓储和工业制造领域&#xff0c;叉车司机的工作强度逐渐增大&#xff0c;疲劳驾驶的风险也随之提升。因此&#xff0c;我们提出了一套能够准确检测叉车司机疲劳状态的系统&#xff0c;以确保驾驶安全&#xff0c;提高工作效率。 安全监控功能主要透过三颗独立摄…

Git协作

文章目录 Git协作冲突冲突的发生情况解决冲突如何处理冲突 1 分支1.1 什么是Git分支1.2 创建分支 2 切换分支2.1 指向分支2.2 暂存分支切换分支与未提交更改的处理使用 Stash 临时保存更改Stash 的工作原理&#xff1a;场景设定使用 Git Stash 3 远程分支3.1 快进合并快进合并的…

亲测,爱回收严选买电脑真的靠谱

近日想买电脑&#xff0c;在某东的爱回收严选看到了9成新的MacBook Pro 2020&#xff0c;因为之前在爱回收严选买手机安全下车&#xff0c;所以我对这个店铺还是信任的&#xff0c;这次买电脑也就没有多犹豫&#xff0c;爱回收严选也确实没让我失望&#xff01; 爱回收严选买二…