Linux下C++程序瘦身

news2024/10/5 20:19:14

目录

  • 一.前言
  • 二.如何瘦身
  • 三.如何读取调试信息文件
  • 四.其他


一.前言

我们知道,C++程序如果带着调试信息的话会比较大,所以一般发布版本都会去掉调试信息,但是我们又希望如果程序崩溃了可以使用core转储文件进行调试,如果不带调试信息就不能方便的进行调试,那要怎么办呢,这篇文章会简单的讨论一下。

二.如何瘦身

我们知道C++程序瘦身的办法就是去掉调试信息。

先看代码

//main.cpp

#include<iostream>

void Func(void)
{
	int* p = nullptr;
	int a = *p;
	std::cout << a << std::endl;
}

int main(int argc, char* argv[])
{
	Func();

	return 0;
}

我们可以看到函数Func()中使用了空指针,这样就会导致程序崩溃。我们使用这个代码生成main程序,然后执行main生成core转储文件,然后利用core转储文件进行调试。

这里要注意的是可能需要先开启生成core转储文件(比如执行命令ulimit -c unlimited),具体这篇文章不展开了。

我们使用-g选项生成一个带调试信息的main,然后看下大小。

在这里插入图片描述

这个时候我们执行命令readelf -S ./main看一下section-headers信息的话,会发现调试信息都包含在内。

在这里插入图片描述

执行main程序生成core转储文件,使用gdb调试。

在这里插入图片描述

我们可以看到gdb调试的时候可以定位到具体问题。

现在使用命令strip --strip-debug ./main去掉main程序里的debug信息(和不开启-g选项生成的main程序基本一样),然后看下大小。

在这里插入图片描述

可以发现main程序的大小下降了很多。

这个时候如果看下section-headers信息,会发现debug信息去掉了,但是符号表信息还包含。

重新执行main程序生成core转储文件,使用gdb调试。

在这里插入图片描述

我们可以看到这个时候gdb调试虽然可以定位问题,但是不够具体。

现在使用命令strip --strip-all ./main去掉所有调试信息,这个时候main程序的大小还会下降的,而且如果看下section-headers信息,会发现符号表信息也去掉了。然后重新执行main程序生成core转储文件,使用gdb调试。

在这里插入图片描述

我们可以看到这个时候gdb调试基本上不能定位问题了。

所以这个时候就是程序瘦身完成了,但是却不能使用core转储文件调试了,我们看下怎么解决。

我们使用-g选项重新生成一个带调试信息的main程序,然后看下大小。

在这里插入图片描述

然后执行命令eu-strip ./main -f ./main.debug去掉main程序的调试信息并且生成调试信息文件main.debug。这个时候main程序的大小以及section-headers的信息和执行命令strip --strip-all ./main基本是一样的(section-headers的信息稍微不同,因为需要记录生成的调试信息文件)。

在这里插入图片描述

重新执行main程序生成core转储文件,使用gdb调试。

在这里插入图片描述

我们可以看到这个时候使用gdb调试可以定位到具体的问题,而且可以看到gdb调试的时候读取了调试文件main.debug。

这样我们就可以只发布main程序,然后备份main.debug,在需要调试的时候拿到main.debug就可以了。这样就可以既给程序瘦了身,还不影响调试。

三.如何读取调试信息文件

使用gdb调试的时候怎么读取调试信息文件呢,我们讨论一下。

gdb调试的时候会在同级目录下读取记录里的调试信息文件,也会在其他的一些目录读取,可以使用命令show debug-file-directory查看。

在这里插入图片描述

也可以在调试的时候指定需要读取的调试信息文件。

我们给main.debug改个名,重新执行main程序生成core转储文件,使用gdb调试。
在这里插入图片描述

我们可以看到这个时候gdb调试基本上不能定位问题了,因为gdb读取不到调试信息文件main.debug。

这个时候我们可以使用symbol-file指定读取调试信息文件。
在这里插入图片描述

这样也可以定位到问题。

启动gdb调试的时候也可以直接指定,而且这样调试还会方便一些。
在这里插入图片描述

四.其他

eu-strip可以使用命令apt install elfutils进行安装。


欢迎讨论,欢迎指正,欢迎转载。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之----贪心算法

数据结构之----贪心算法 什么是贪心算法&#xff1f; 贪心算法是一种常见的解决优化问题的算法&#xff0c;其基本思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优的决策&#xff0c;以期望获得全局最优解。 贪心算法简…

SpringBoot配置文件加载的优先级及自定义配置

Spring Boot使用一个非常特殊的PropertySource顺序&#xff0c;旨在允许合理的值重写&#xff0c;越靠前优先级越高。属性按以下顺序考虑&#xff1a; 开发者工具Devtools全局配置参数 在IDEA或Eclipse中&#xff0c;安装并启用Spring Boot Devtools插件。打开项目的Settings…

[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences

文章目录 1 介绍2 模型架构3 结果 论文&#xff1a;Big Bird: Transformers for Longer Sequences 作者&#xff1a;Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Am…

【Java 并发】三大特性

在 Java 的高并发中&#xff0c;对于线程并发问题的分析通常可以通过 2 个主核心进行分析 JMM 抽象内存模型和 Happens-Before 规则三大特性: 原子性, 有序性和可见性 JMM 抽象内存模型和 Happens-Before 规则, 前面我们讨论过了。这里讨论一下三大特性。 1 原子性 定义: 一个…

HarmonyOS4.0从零开始的开发教程17给您的应用添加通知

HarmonyOS&#xff08;十五&#xff09;给您的应用添加通知 通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(一)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

Win11极速安装Tensorflow-gpu+CUDA+cudnn

文章目录 0.pip/conda换默认源1.Anacondapython虚拟环境2.安装CUDA以及cudnn测试tensorflow的GPU版本安装成功的办法 0.pip/conda换默认源 为了高效下载&#xff0c;建议先把默认源换了&#xff0c;很简单这里不再赘述。&#xff08;我用梯子&#xff0c;所以没换源&#x1f6…

数据分析(一)(附带实例和源码)

一、主要目的&#xff1a; 主要利用Python包&#xff0c;如Numpy、Pandas和Scipy等常用分析工具并结合常用的统计量来进行数据的描述&#xff0c;把数据的特征和内在结构展现出来。熟悉在Python开发环境中支持数据分析的可用模块以及其中的方法&#xff0c;基于一定的样例数据…

【Java】使用递归的方法获取层级关系数据demo

使用递归来完善各种业务数据的层级关系的获取 引言&#xff1a;在Java开发中&#xff0c;我们通常会遇到层层递进的关系型数据的获取问题&#xff0c;有时是树状解构&#xff0c;或金字塔结构&#xff0c;怎么描述都行&#xff0c;错综复杂的关系在程序中还是可以理清的。 这…

服务器RAID配置及功能介绍

服务器RAID配置及功能介绍 一、RAID磁盘阵列详解1.RAID磁盘阵列介绍2.RAID 03.RAID14.RAID35.RAID56.RAID67.RAID 10总结阵列卡介绍 一、RAID磁盘阵列详解 1.RAID磁盘阵列介绍 ①是Redundant Array of lndependent Disks的缩写中文简称为独立冗余磁盘阵列。 ②把多块独立的物…

nginx_rtmp_module 之 ngx_rtmp_mp4_module 的mp4源码分析

一&#xff1a;整体代码函数预览 static ngx_int_t ngx_rtmp_mp4_postconfiguration(ngx_conf_t *cf) {ngx_rtmp_play_main_conf_t *pmcf;ngx_rtmp_play_fmt_t **pfmt, *fmt;pmcf ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_play_module);pfmt ngx_ar…

Prometheus 监控笔记(1):你真的会玩监控吗?

认识Prometheus Prometheus 是一种开源的系统和服务监控工具&#xff0c;最初由 SoundCloud 开发&#xff0c;后来成为继 Kubernetes 之后云原生生态系统中的一部分。在 Kubernetes 容器管理系统中&#xff0c;通常会搭配 Prometheus 进行监控&#xff0c;同时也支持多种 Expo…

Node.js安装教程

虽然网上Node.js的安装教程有很多&#xff0c;但是基本上都是千篇一律。虽然跟着网上内容安装&#xff0c;却总会遇到乱七八糟的问题。为此&#xff0c;我写下这篇文章&#xff0c;除了描述node的安装教程&#xff0c;还会解释这样安装的过程起到一个什么作用。 文章大致上分为…

visual studio 2019 移除/卸载项目已经如何再加载项目

文章目录 移除解决方案下的某个项目添加已移除的项目移除项目加载已卸载的项目注意事项 移除解决方案下的某个项目 在项目名称上&#xff0c;点击鼠标右键&#xff0c;弹出右键工具栏&#xff0c;找到 移除 功能。 然后鼠标左键点击 移除。 弹出的模态框&#xff0c;选择确定…

《点云处理》平面拟合

前言 在众多点云处理算法中&#xff0c;其中关于平面拟合的算法十分广泛。本篇内容主要是希望总结归纳各类点云平面拟合算法&#xff0c;并且将代码进行梳理保存。 环境&#xff1a; VS2019 PCL1.11.1 1.RANSAC 使用ransac对平面进行拟合是非常常见的用法&#xff0c;PCL…

josef约瑟 时间继电器 DS-23/C AC220V 10S柜内板前接线

系列型号&#xff1a; DS-21时间继电器 &#xff1b;DS-22时间继电器&#xff1b; DS-23时间继电器&#xff1b;DS-24时间继电器&#xff1b; DS-21C时间继电器&#xff1b;DS-22C时间继电器&#xff1b; DS-23C时间继电器&#xff1b; DS-25时间继电器&#xff1b;DS-26…

Delphi 编译关闭时 Stack overflow 错误

本人工程文件&#xff0c;编译EXE文件&#xff0c;程序关闭时出现 Stack overflow 错误。网搜索一些解决办法&#xff1a;比如&#xff0c;加大堆栈...&#xff0c;均不能问题。虽然&#xff0c;生成的EXE文件&#xff0c;执行时&#xff0c;无任何问题。 Stack overflow 错误&…

【面试】测试/测开(NIG2)

145. linux打印前row行日志 参考&#xff1a;linux日志打印 前10行日志 head -n 10 xx.log后10行日志 tail -n 10 xx.log tail -10f xx.log使用sed命令 sed -n 9,10p xx.log #打印第9、10行使用awk命令 awk NR10 xx.log #打印第10行 awk NR>7 && NR<10 xx.log …

基于JSP+Servlet+Mysql的建设工程监管信息

基于JSPServletMysql的建设工程监管信息 一、系统介绍二、功能展示1.企业信息列表2.录入项目信息3.项目信息列表 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于JSPServlet的建设工程监管信息 项目架构&#xff1a;B/S架构 开发语言&#xff1a;…

IEEE、Sci-Hub

最近要写毕业论文&#xff0c;记录一下查询资料的网站。 IEEE&#xff08;Institute of Electrical and Electronics Engineers&#xff09;是世界上最大的专业技术协会之一&#xff0c;致力于推动电气和电子工程领域的创新和发展。IEEE成立于1884年&#xff0c;总部位于美国纽…