【软件开发底层知识修炼】六 Binutils辅助工具之- addr2line与strip工具

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

上一篇文章我们学习了gcc编译器的相关内容。点击查看上一篇文章:gcc编译器。本篇文章接着上一篇文章,学习GNU为GCC提供的辅助开发工具集Binutils。Binutils工具集,主要是用于在代码调试的时候,定位bug的一些手段。我们主要学习以下几个工具的使用:
在这里插入图片描述

本篇文章先学习使用addr2line与strip工具。

文章目录

  • 1、addr2line工具
  • 2、strip工具
  • 3、总结

1、addr2line工具

首先我们要知道,gcc编译程序的时候,加上-g选项,表示在目标文件中生成调试信息。几乎所有调试辅助工具,都依赖于程序的调试信息。

addr2line工具。顾名思义,可以将地址转换为行号。它常用于分析定位内存访问错误的问题。以实际例子为例:

test.c程序

#include <stdio.h>int g_global = 0;
int g_test = 1;extern int* g_pointer;
extern void func();int main(int argc, char *argv[])
{printf("&g_global = %p\n", &g_global);printf("&g_test = %p\n", &g_test);printf("&g_pointer = %p\n", &g_pointer);printf("g_pointer = %p\n", g_pointer);printf("&func = %p\n", &func);printf("&main = %p\n", &main);func();return 0;
}

func.c程序

#include <stdio.h>int* g_pointer;void func()
{*g_pointer = (int)"D.T.Software";return;
}

我们在linux下编译以下程序(注意我使用gcc-4.4.5版本编译没有警告显示。但是使用较高版本的gcc编译器,可能会有警告。这里我们忽略警告):

  • gcc -g func.c test.c -o lyy

运行程序

  • ./lyy

显示结果为:
在这里插入图片描述

其实结果也在意料之中。我们分析程序很容易知道,func函数中 *g_pointer = (int)"D.T.Software"; 这句话,使得在0地址赋值了。因为int* g_pointer;只是定义了g_pointer却没有赋值,那么g_pointer实际上一开始是指向0地址,后面又对它进行赋值。相当于对0地址进行操作。

但是我们知道0地址,是不能被操作的。所以会产生段错误。这个程序很短,问题我们很容易发现。但是如果这个歌程序有一千行,一万行的话,那么问题就很难定位到。此时addr2line工具就能够上场。

下面来说明如何使用addr2line工具。

  1. 首先开启core dump选项。使用命令ulimit -c unlimited。开启这个选项后,在运行可执行程序的时候,会将程序崩溃前最后一刻的内存状态信息,转储(保存)到一个core文件。这个文件叫做核心转储文件。我们可以通过读取该文件,获取一些用于调试的信息。
    在这里插入图片描述

  2. 开启core dump选项后,再次运行可执行程序,来生成core文件。

在这里插入图片描述

我们可以看到,段错误后面显示核心已转储。此时查看当前目录的话,就可以看到core文件。
在这里插入图片描述

  1. 读取core文件,获取IP寄存器的值(IP寄存器存的是当前CPU所要执行指令的值,程序崩溃前最后一刻的IP寄存器的值,就是崩溃的指令地址)。使用dmesg core 命令读取core文件的内容,显示内容最后部分如下:

在这里插入图片描述

可以看到,最后一刻IP寄存器的值为0x080483d1.出问题的代码就在这个地址处。但是我们无法知道这个地址处到底是个啥。但是可以利用addr2line工具,将这个地址转换为代码中对应的行号。

  1. 使用addr2line定位对应的代码行。使用命令:addr2line 0x080483d1 -f -e lyy

在这里插入图片描述

很明显,已经找打原因,是func.c程序的第7行。当从两万行大代码中找到这个错误,也是很激动的!!!

2、strip工具

实际上,addr2line能够正常工作,必须依赖于程序的调试信息。而我们在编译程序的时候,也确实让程序生成了调试信息。如上编译的时候带的-g选项。

当可执行程序里面带有大量的调试信息,会导致可执行程序,非常的大。如果在大型的软件中,软件在发布之前,肯定是要将这些调试信息去掉,好让发布出去的程序占用内存空间更小,不然程序太大,对用户来说也是非常不友好的。

其实这就是所谓的release版本的程序。在发布之前,还需要调试的程序,我们称为debug版本程序。

那么如何剔除调试信息?使用strip工具!如下图是release版本的程序大小为9074:
在这里插入图片描述

使用strip将调试信息剔除后大小为5512:
在这里插入图片描述

结果显而易见!!!

还有其他工具,放在下一篇文章学习!!!

3、总结

  • addr2line用于将代码地址转换为对应的行号。常用于定位内存访问错误的问题
  • 理解core dump选项。
  • strip可以剔除目标程序中的调试信息,从而可以减小目标代码的大小,提升目标程序的执行效率。
  • 学会使用上述两个工具。

本文章参考狄泰软件学院相关课程
想学习的可以加狄泰软件学院群,
群聊号码:199546072

学习探讨加个人(可以免费帮忙下载CSDN资源):
qq:1126137994
微信:liu1126137994

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

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

相关文章

Eboot 中给nandflash分区实现

提到分区就不得不提到MBR&#xff0c;不得不提到分区表。 什么是MBR 硬盘的0柱面、0磁头、1扇区称为主引导扇区&#xff0c;NANDFLASH由BLOCK和Sector组成&#xff0c;所以NANDFLASH的第0 BLOCK&#xff0c;第1 Sector为主引导扇区&#xff0c;FDISK程序写到该扇区的内容称为主…

kmp匹配算法

kmp匹配算法1.第一种方式是暴利匹配方式2.第二种方式采用kmp 方式进行匹配3. 相应的代码1.第一种方式是暴利匹配方式 暴利匹配规则 模型: str1 位源字符串下标为i&#xff0c;str2位匹配字符串,下标为j 。 假设 str1 匹配到i , str2 匹配到j 则有 &#xff08;1&#xff09;当 …

【软件开发底层知识修炼】七 Binutils辅助工具之- ar工具与nm工具

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章学习addr2line与strip工具。点击链接查看上一篇文章&#xff1a;点击查看 本篇文章学习两个工具&#xff1a;ar与nm工具。 文章目录1、ar工…

【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具

上一篇文章学习了ar工具与nm工具&#xff0c;点击链接查看上一篇文章&#xff1a;点击链接 本片文章学习记录以下三个工具: objdumpsizestrings 1、objdump工具 用法&#xff1a; 反汇编目标文件&#xff0c;查看汇编到源码的映射&#xff08;后面代码案例分析看具体区别&a…

【C++深度剖析教程39】实现C++数组类模板

上一篇文章在那个学习了多参数类模板与特化的分析&#xff1a;点击链接查看上一篇文章&#xff1a;类模板深度剖析 本篇文章学习记录&#xff1a; 数值型模板参数实现C数组类模板 1、模板中的数值型参数 模板参数可以是数值型参数。也就是非类型参数。如下图所示&#xff1…

前端学习(168)全局事件属性

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/ TR/html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>事件</ti…

【原】两个时间相加的运算符重载实现

要求&#xff1a;两个时间相加&#xff0c;得到的时间形如“xx时&#xff1a;xx分&#xff1a;xx秒” -------------------------------------------------------------------------------------------------------------- 解答&#xff1a; 首先编写时间处理类 时间类 1 ///&l…

IOT变现

IOT&#xff08;物联网&#xff09;变现1. IOT 设备基础结构2.IOT 组成元素3.从M2M扩展到IOT的世界4. 工业4.0最近在看IOT变现&#xff0c;记录一下核心的知识点概念&#xff1a;IOT 是利用无线标签&#xff0c;传感器&#xff0c;MEMS(micro-ElectroMechanical System&#xf…

【C++深度剖析教程40】使用数值型模板技术计算1+2+3+...+N的值

上一篇文章学习了数值型模板技术&#xff0c;并利用相关技术&#xff0c;实现了C的数组类模板。点击文章查看上一篇文章&#xff1a;点击链接查看 本篇文章&#xff0c;继续利用模板技术来解决一个问题。 如果想求123…N的结果&#xff0c;有很多种方法。可以循环遍历&#x…

前端学习(169):无语义元素

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>无语义标签&…

dubbo思维导图

dubbo思维导图之前总结的 后续持续更新中

前端学习(170):无语义元素二

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>DIVCSS布局&…

【软件开发底层知识修炼】九 链接器-可重定位文件与可执行文件

上几篇文章学习了Binutils辅助工具里面的几个实用的工具&#xff0c;那些工具对于以后的学习都是非常有帮助的&#xff0c;尤其是C语、C语言的学习以及调试是非常有帮助的。点击链接查看上一篇文章&#xff1a;点击查看 本篇文章开始一个新的知识的学习&#xff0c;链接器的学习…

【软件开发底层知识修炼】十 链接器-main函数不是第一个被执行的函数

上一篇文章&#xff0c;大概了解了链接器的工作内容就是&#xff1a;符号解析和重定位。点击上一篇文章查看&#xff1a;点击查看。 本片文章其实还是围绕链接器来学习。只不过不是很明显&#xff0c;当你学到下一篇文章时&#xff0c;就明白了。 本篇文章来弄明白一个问题&a…

分享博文摘要图标【11/16更新】

经常写文章&#xff0c;希望给朴素的浏览界面添加一些生动的图标&#xff0c;让浏览者直接通过图片来得知这篇文章讲的是什么&#xff1f; &#xff08;效果预览...&#xff09; 博主特意搜集并上传了一些大家可能会用到的图标&#xff0c;提供16、32、48、64、128、甚至256像素…

【OS学习笔记】十二 现代处理器的结构和特点

本文是一个衔接点&#xff0c;上一篇文章以前都是学习8086实模式的知识。本文开始学习80386这种现代处理器的编程架构。由此进入保护模式的学习。点击链接查看上一篇文章&#xff1a;上一篇文章 1、现代处理器的结构和特点 1 流水线技术 处理器可以做很多事情&#xff0c;能…

前端学习(172):格式化文本

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>格式化</…

输出星号平行四边形

输出星号平行四边形 代码 #include <stdio.h>intmain(){inti, j, k, max; printf("Input max:"); scanf("%d", &max);for(i 1; i <max /21; i) /*1~max / 2 1 行 */{for(j max /2-i; j >0; j--) /*第i行的空白字符 */{ putchar(); }for(j…

投资理财分享

投资理财分享理财是作为工作之外的另一个技能&#xff0c;一直想去学习&#xff0c;但是由于种种原因&#xff0c;推迟&#xff0c;最近开始了自己理财课程&#xff0c;适合小白入手&#xff0c;持续更新中&#xff1b;

【OS学习笔记】十三 保护模式一:全局描述符表(GDT)

上一篇文章&#xff0c;我们大致领略了现代处理器的结构和特点。点解链接查看上一篇文章&#xff1a;现代处理器的结构和特点 本篇文章开始&#xff0c;学习保护模式下的的各种机制。什么是保护模式呢&#xff1f; 一般来说&#xff0c;操作系统负责整个计算机软硬件的的管理…