Linux开发中的辅助工具

news2024/11/25 20:52:11

文章目录

  • 前言
  • 一、add2line
  • 二、strip
  • 三、ar
  • 四、nm
  • 五、objdump
  • 六、size
  • 七、strings
  • 总结


前言

本篇文章我们来介绍一些Linux开发中的辅助工具,有了这些辅助工具将会让我们的开发变的更加轻松。

一、add2line

addr2line是一个GNU调试工具,用于将程序计数器(PC)地址转换为对应的源文件名、函数名和行号。addr2line可通过调试信息,将内存地址映射到源代码行号,并在开发人员调试应用程序时帮助找到问题所在。addr2line通常与交叉编译器一起使用,用于在代码嵌入式或远程设备上汇报错误的处理信息。

addr2line的命令行参数语法为:

addr2line [-CfpHsvV] [-e filename] [-j section] [-a address] [address ...]

其中,参数说明如下:

-C: 此选项用于修复函数名。addr2line可以对编译器生成的能够适应C++的名称进行反向演绎,使名称更易于读取和理解。
-f: 此选项用于输出函数名称。
-p: 此选项用于调解指针地址为C++名称。
-H: 此选项用于输出全部文件名、函数名称、和行号。
-s: 此选项用于输出文件名和行号。
-v: 此选项用于详细输出,比如唯一的文件和否则可能无法报告的错误。
-V: 此选项用于输出程序版本信息。
-e filename: 此选项用于指定可执行文件。
-j section: 此选项用于指定要查找的节。
-a address: 此选项用于指定要查找的内存地址。
addr2line的常见应用场景包括:

追踪程序的异常:addr2line可以将地址解析为函数名和行号,用于追踪程序崩溃的原因,定位并修复异常。

函数调用跟踪:addr2line可以将函数调用的地址映射到对应的源代码中,用于跟踪和调试函数调用过程。

性能分析:addr2line可以将程序计数器地址转换为对应的文件名和行号,用于性能分析和代码优化。

下面举一个例子:

这里编写了一个错误的代码,下面我们使用addr2line来查找这段代码出错的位置。

#include <stdio.h>

int* g_pointer;

void fun()
{
    *g_pointer = (int)"Hello";
}

int main(void)
{

    fun();

    return 0;

}

编译代码并没有明显错误:
在这里插入图片描述
执行代码发生段错误:
在这里插入图片描述
生成了对应的core文件:
在这里插入图片描述
使用lldb查看内存错误地址:
在这里插入图片描述

二、strip

strip 是一个 Linux 系统下的命令行工具,可以用于去除可执行文件或共享库中的符号表和调试信息,从而减小文件大小。它通常在编译后的可执行文件优化和瘦身时被使用。由于符号表和调试信息比源代码更容易逆向工程,因此在发布生产环境时使用 strip 可以增强二进制文件的安全性。

使用 strip 命令的方式非常简单,通常只需要在终端中输入以下命令:

strip <file>

其中,file 是要去除符号表的可执行文件或共享库。

strip 去除符号表信息的方式是将可执行文件或共享库中的符号表和调试信息部分截取掉,因此在进行这个操作时需要特别小心,以免破坏二进制文件的完整性,导致其不能正常运行。在进行图像等文件压缩优化时,应谨慎选择去除的符号表信息。

示例:

#include <stdio.h>


int main(void)
{
    printf("Ddebug\n");

    return 0;
}

编译程序查看程序大小:
在这里插入图片描述
使用strip去除调试信息后的大小:
在这里插入图片描述

三、ar

ar 是一个 Linux 系统下的命令行工具,用于创建、修改和提取静态库。它被包含在 binutils 工具包中,通常与 gcc 和 ld 等工具一起使用。静态库是一组已经编译好的二进制模块文件的集合,包含一组函数和数据结构等。

ar 的基本用法是将多个目标文件(通常是 .o 或 .a 格式)打包成一个静态库,该静态库的文件扩展名通常是 .a。创建一个静态库可以使用以下命令:

首先编写两个文件一个test.c和fun.c文件:

test.c:

extern void func(void);

int main(void)
{
    func();

    return 0;
}


fun.c:

#include <stdio.h>

void func(void)
{
    printf("func\n");
}

生成.o文件:
在这里插入图片描述
将.o文件编译成静态库:
这里就生成了libtest.a这个静态库了:
在这里插入图片描述
既然可以生成静态库那么肯定就可以将静态库解压出来了:
在这里插入图片描述
使用ar x可以将生成的静态库解压出来。

四、nm

nm 是一个 Linux 系统下的命令行工具,用于显示二进制目标文件(可执行文件或库文件)中的符号(Symbol),包括函数和变量名等。

nm 可以用于检查二进制文件的符号表信息,它可以列出二进制文件中包含的所有符号、这些符号所处的节(节是编译后二进制文件中包含的一个段)以及它们的类型(如函数、变量等)。nm 常用于调试和检查程序的二进制文件。

nm 命令的常见用法如下:

nm <file>:查看文件(如可执行文件或库文件)中包含的所有符号。

nm -u <file>:列出未定义符号的名称,这些符号是需要在连接时动态解析的符号,通常需要通过静态或共享库来定义。

nm -g <file>:只列出全局符号的名称,全局符号是可被其他模块所引用的符号,多次定义时会引发重定义错误。

nm -D <file>:只列出动态符号的名称,动态符号是在动态链接时解析的符号,如共享库中导出的符号。

nm -C <file>:将 C++ 操作符和函数名还原为可读的形式。

输出结果由三部分组成:
地址,段,标识符
在这里插入图片描述
nm输出标识符的含义:
T:该符号是一个函数,并且是在该文件中定义的。

t:该符号是一个函数,并且是在该文件中局部定义的(即只能在该文件中访问)。

D:该符号是一个已初始化的全局变量或静态变量,并且是在该文件中定义的。

d:该符号是一个已初始化的局部变量或静态变量,并且是在该文件中定义的。

B:该符号是一个未初始化的全局变量或静态变量,并且是在该文件中定义的。

b:该符号是一个未初始化的局部变量或静态变量,并且是在该文件中定义的。

U:该符号是一个未定义的符号,需要在链接时解析,通常是在其他文件或库文件中被定义的符号。

五、objdump

objdump 是一个 Linux 系统下的命令行工具,可以用于显示目标文件(可执行文件或共享库)的可读汇编代码、符号表、段信息等。这个工具通常在调试和逆向工程中使用,可用于分析二进制文件的结构和行为。

objdump 命令的常见用法如下:

objdump -d :显示文件中的可读汇编代码,包括已编译的程序和函数等。

objdump -t :显示文件的符号表,包括函数、变量等信息。

objdump -h :显示文件的段表,包括段的名称、大小、虚拟地址、文件偏移等信息。

objdump -x :显示文件的所有头部信息,包括 ELF 头、程序头、段头等。

使用示例:
objdump -d
在这里插入图片描述
dis文件内容:
在这里插入图片描述

objdump -h
在这里插入图片描述
输出结果:
在这里插入图片描述

六、size

size 是一个 Linux 系统下的命令行工具,用于显示可执行文件或共享库的代码段、数据段和未初始化的数据段等占用的空间大小。size 命令的输出结果分别显示程序代码、数据段和未初始化数据段占用的字节数、十六进制字节大小以及百分比大小。

size 命令的常见用法如下:

size :显示指定文件的大小信息,包括 .text(代码段)、.data(数据段)和 .bss(未初始化的数据段)三个部分。

size -A :显示指定文件的对齐大小,即程序头或段头按照规则对齐后占用的空间。

size -d :只显示数据段和未初始化的数据段的大小。

size -t :只显示代码段的大小。

使用示例:
在这里插入图片描述

七、strings

strings 是一个 Linux 系统下的命令行工具,用于从二进制文件中提取可打印字符串。这个工具通常用于查找二进制文件中的常量字符串、密码以及其他敏感信息。

strings 命令的常见用法如下:

strings <file>:从指定的文件中提取可打印字符串。

strings -n :设置最小字符串长度,只输出长度不小于指定长度的字符串。例如 strings -n 8 a.out 只会输出长度不小于 8 的字符串。

strings -a :显示所有字符串,包括未打印的字符。

strings -t :指定输出字符串的编码格式,常用的格式有 s、d、o、x,分别代表 ASCII、十进制、八进制和十六进制格式。

使用示例:

#include <stdio.h>


int main(void)
{
    char* p = "Hello";
    char* p1 = "World";

    return 0;

}

在这里插入图片描述

总结

本篇文章就介绍到这里了,这些工具在我们嵌入式Linux开发还是比较有用的,希望大家可以好好掌握。

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

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

相关文章

priority_queue的模拟实现和仿函数

priority_queue模拟 首先查看源代码&#xff0c;源代码就在queue剩下的部分中 push_heap是STL库中的堆算法&#xff0c;STL库中包装有支持堆的算法&#xff0c;在algorithm.h中&#xff1a; 只要不断用堆的形式插入数据&#xff0c;就会形成堆。 priority_queue模拟——初版 pr…

自定义组件中,使用onLoad,onShow生命周期失效问题

的解决方法 自定义组件中&#xff0c;使用onLoad,onShow生命周期失效问题 自定义组件中&#xff0c;使用onLoad,onShow生命周期失效问题 官方文档可查阅到&#xff1a; 页面生命周期仅在page中的vue页面有效&#xff0c;而单独封装的组件中【页面周期无效】&#xff0c;但是Vu…

Pytorch入门(四)使用VGG16网络训练CIFAR10数据集

本文使用PytorchVGG16官方CIFAR10数据集完成图像分类。识别效果如下&#xff1a; 文章目录 一、VGG16 神经网络结构二、VGG16 模型训练三、预测CIFAR10中的是个类别 一、VGG16 神经网络结构 VGG&#xff0c;又叫VGG-16&#xff0c;顾名思义就是有16层&#xff0c;包括13个卷…

地震勘探基础(十)之地震速度关系

地震速度 地震勘探中引入了多种速度的概念&#xff0c;如下图所示。 层速度、平均速度和均方根速度之间的关系 层速度指的是某一套地层垂向上&#xff0c;由于地质条件相对稳定&#xff0c;地层顶底厚度比上地震波的传播时间为层速度&#xff0c;用 v n v_n vn​ 表示。 如下…

一文看懂软件架构4+1视图

目录 一、概述 二、各视图详解 1. 场景视图 2. 逻辑视图 3. 开发视图 4. 处理视图 5. 物理视图 葵花宝典&#xff1a;一看就懂的理解方式 一、概述 41视图包括&#xff1a; 场景视图&#xff08;也叫用例视图&#xff09;&#xff1a;黑盒视图。从外部视角&#xff…

chatgpt赋能python:Python如何分段数据的平均数

Python如何分段数据的平均数 Python是一门极其流行的编程语言&#xff0c;广泛应用于数据分析与科学计算领域。在数据分析中&#xff0c;计算各个数据段的平均数是一项常见的任务。本文将介绍如何使用Python分段计算数据的平均数&#xff0c;以及如何优化这一过程以使速度更快…

Linux中的lrzsz

一、介绍 lrzsz是一款在Linux里可代替ftp上传和下载的程序,也就是一款软件。它是开发者常用的一款工具,这个工具用于windows机器和远端的Linux机器通过XShell传输文件。 二、lrzsz的安装 在安装之前,我们可以使用下述命令先查看yum仓库中是否存在我们要安装的软件: yum…

CentOS7使用Docker快速安装Davinci

环境信息 操作系统&#xff1a;CentOS7Docker : 23.0.6 &#xff08;已配置阿里云镜像加速&#xff09; 安装步骤 安装docker-compose-plugin 官方的例子使用的是docker-compose&#xff0c;但是由于yum能够安装的最新斑斑是1.x,而且官方的docker-compose要求最低版本为2.2以…

首个区块链技术领域国家标准出台 ,中创助力打造区块链技术和应用创新高地

区块链作为数字中国的重要技术底座&#xff0c;正在深刻改变着我国社会生产方式。何谓区块链&#xff0c;对大众来说&#xff0c;也许尚陌生&#xff0c;殊不知&#xff0c;这一产业已稳稳起跑在我国高质量发展的“赛道”上。 近日&#xff0c;《区块链和分布式记账技术参考架…

【JavaScript】超全基础万字大总结

目录 一、初识 JavaScript 1.1 JavaScript 是什么&#xff1f; 1.2 发展历史 1.3 JavaScript 和 HTML 和 CSS 之间的关系 1.4 JavaScript 运行过程 1.5 JavaScript 的组成 二、前置知识 2.1 第一个程序 2.2 JavaScript 的书写形式 2.3 输入输出 三、语法概览 3.1 变…

Linux(CentOS 7) 安装 Mysql8 、Java 以及 mycat2 详细流程

目录 一、Mysql8 安装 1.下载mysql8 2. 解压Mysql 压缩包 3.重名命mysql 文件 4.创建data文件夹 储存文件 5.创建用户组以及用户 6.授权用户 将mysql文件夹的所有者和所有组都改为mysql 7.mysql初始化进入bin目录执行mysqld文件进行初始化 8.编辑my.cnf 9.添加mysqld…

有哪些虚拟化和容器化工具推荐? - 易智编译EaseEditing

以下是几个常用的虚拟化和容器化工具推荐&#xff1a; VMware vSphere&#xff1a; VMware vSphere 是一套完整的虚拟化平台&#xff0c;包括虚拟化服务器、虚拟化存储和虚拟化网络。 它提供了高性能的虚拟机管理和资源调度功能&#xff0c;适用于企业级的虚拟化部署。 Docke…

IT知识百科:什么是跨站脚本(XSS)攻击?

跨站脚本&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者利用该漏洞在受害者的网页中插入恶意脚本&#xff0c;从而能够获取用户的敏感信息、劫持会话或进行其他恶意活动。本文将详细介绍跨站脚本攻击的原理、类型、常…

vue props传值层级多,子级孙子级怎么修改传参

vue props传值层级多了&#xff0c;子级孙子级怎么修改传参 1.出现背景2.怎么在孙组件里改变传过来的值呢2.1这样改是不行的2.2可行的方法2.2.1 引用对象只改变单属性2.2.2 provide和inject 1.出现背景 本来自己写页面的话是直接全部写在一个vue文件里&#xff0c;一个vue文件…

【solidworks】此文档 templates\gba0.drwdot 使用字体长仿宋体,而该字体不可用

一、问题背景 在SolidWorks中绘制工程图纸时&#xff0c;新建一个图纸&#xff0c;打开后就弹出字体错误 此文档 templates\gba0.drwdot 使用字体长仿宋体&#xff0c;而该字体不可用。 二、解决办法 点击选择新的字体&#xff0c;拖到最下面选择汉仪长仿宋体。 上面之所…

41 管理虚拟机可维护性-虚拟机NMI Watchdog

文章目录 41 管理虚拟机可维护性-虚拟机NMI Watchdog41.1 概述41.2 注意事项41.3 操作步骤 41 管理虚拟机可维护性-虚拟机NMI Watchdog 41.1 概述 NMI Watchdog是一种用来检测Linux出现hardlockup&#xff08;硬死锁&#xff09;的机制。通过产生NMI不可屏蔽中断&#xff0c;…

win10+tf2.x+cuda+cudnn踩坑记录( Loaded cuDNN version 8400)

项目场景&#xff1a; 项目用到了tensorflow2.x&#xff1a; 想要用GPU跑算法win10系统下需要安装cuda和cudnn配置带有tenserflow-gpu的环境 问题描述 jyputer运行错误提示&#xff1a;Loaded cuDNN version 8400 Could not locate zlibwapi.dll. Please make sure it is in…

智安网络|保护企业网络空间资产安全的重要性

在数字化时代&#xff0c;企业网络空间资产的安全和保护变得越来越重要&#xff0c;并且拥有安全性能优越、系统完整的企业网络系统&#xff0c;是企业发展的必要条件。但想要实现网络空间安全首先需要关注网络漏洞问题。 保护企业网络空间资产的重要性 网络空间资产安全是企…

【深度学习】跌倒识别(带数据集和源码)从0到1,内含很多数据处理的坑点和技巧,收获满满

文章目录 前言1. 数据集1.1 数据初探1.2 数据处理1.3 训练前验证图片1.4 翻车教训和进阶知识 2. 训练3.效果展示 前言 又要到做跌倒识别了。 主流方案有两种&#xff1a; 1.基于关键点的识别&#xff0c;然后做业务判断&#xff0c;判断跌倒&#xff0c;用openpose可以做到。…

Neural Architecture Search: A Survey

本文是神经架构搜索相关主题的第一篇文章&#xff0c;针对《Neural Architecture Search: A Survey》的一个翻译。 神经架构搜索&#xff1a;综述 摘要1 引言2 搜索空间3 搜索策略4 性能评估策略5 未来方向 摘要 过去几年&#xff0c;深度学习在图像识别、语音识别和机器翻译…