binutils工具集之---addr2line


addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号。
在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器,读者通常可以找到arm-rtems-addr2line ,arm-rtems-objdump等相应名称的工具,这是GNU工具集的一种命名惯例。
本文并不是binutils工具集的完整参考手册,当需要得到更为详细的帮助信息时,可以参照对应工具的man和info信息。另一个更为简单的方法时运行相应的工具并指定--help参数,可以获得该工具的简单帮助信息。
用法:addr2line [选项] [地址]
将地址转换成文件名/行号对。
如果没有在命令行中给出地址,就从标准输入中读取它们
选项是:
@<file> 读取选项从 <file>
-a --addresses 显示地址
-b --target=<bfdname> 设置二进位文件格式
-e --exe=<executable><name> 设置输入文件名称(默认为 a.out)
-i --inlines 解开内联函数
-j --section=<name> 读取相对于段的偏移而非地址
-p --pretty-print 让输出对人类更可读
-s --basenames 去除目录名
-f --functions 显示函数名
-C --demangle[=style] 解码函数名
-h --help 显示本帮助
实战操练:
建立main.c文件如下:

输入:
gcc -g main.c -o app -Wall
一定要加-g选项,不然没有调试信息。
编译没有任何警告(作为gcc来说不应该啊^_^)
运行

显示段错误。使用dmesg(该命令可以参考https://linux.cn/article-3587-1.html)追踪:

注意最后一行 app 可执行文件的描述:segfault(段错误)ip为4004e6这就是程序执行出错的位置。这时,addr2line登场:

显示在在我的目录下 main.c的第七行出现段错误,现在回过头去看第一幅图片,你应该会发现addr2line准确地得到了我们想要调试的东西。
一般常用的两个option为-f和-e。
下面,我们再来做一件有意思的事情:
main.c如下:

运行如下:

这里的地址是通过程序打印而获得,在现实工作中往往是程序崩溃是通过某种方式获得地址,比如上面的dmesg,或者在嵌入式系统的一些IDE上也有类似功能。通过nm -n指令可以看到函数对应的开始地址:只取foo和main函数截图如下:

可以看出foo函数是有大小的,foo函数的大小就是main的地址减去foo的地址。如果传递给addr2line的地址是400526-400541之间的任意地址会输出什么呢?

测试结果表明,addr2line可以通过函数的任一地址找到所属函数的相关信息。
根据地址找到了函数名,现在我们写一个c++程序main.cpp如下 图:

运行如下:

首先和C语言一样,addr2line找到了foo函数入口在main.cpp的第五行,(也可以看出函数调用是从大括号处开始),但是函数名却是_Z3f00v,这就有点奇怪了,怎么不是foo呢?这是因为c++的重载使得这一现象产生。从C语言的角度来看c++的重载函数名称必须不同,为了做到这一点,c++编译器的处理方法就是对于每一个函数,将根据输入参数采取一定的编码方式,形成不同的c函数名,这个过程就是名字分裂过程。如上的 _Z3f00v就是c++程序中foo()函数的名字分裂后的形式。毕竟c++是从C语言上发展而来的。
我们可以通过--demangle选项获得函数名:

--demangle=gnu-v3用于还原foo()函数。
binutils工具集之---addr2line的更多相关文章
- Binutils工具集常用工具
GNU为GCC编译器提供了配套的辅助工具集(Binutils)http://www.gnu.org/software/binutils/ 1. addr2line ①将指定地址转换为对应的文件名和行号 ...
- Makefile 学习&binutils工具集,软件开发利器
gcc -E 能有效的帮助我们解决与宏有关的编译错误: gcc -S能获得一个C源程序文件的汇编程序: gcc -v能获得系统头文件的路径 生成依赖关系: gcc -M gcc -MM 生成不包含系统 ...
- binutils工具集之---nm
nm用于列出程序文件中的符号.建立nmtest.c文件: #include<time.h> int global1; ; static int static_global1; ; void ...
- binutils工具集之---objdump
在嵌入式软件开发中,有时需要知道所生成的程序文件中的段信息以分析问题,或者需要查看c语言对应的汇编代码,此时,objdump工具就可以帮大忙了.obj——object dump:转储. #inclu ...
- 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释
#1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...
- binutils工具集之---ar
1.如果要将多个.o文件生成一个库文件,则存在两种类型的库,一种是静态库,在linux里面后缀是.a,另一种是动态库,后缀为.so. 当可执行程序要与静态库进行链接时,所用到的库中的函数和数据会被拷贝 ...
- binutils工具集之---objcopy,ranlib,size,strings,strip
objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中.objcopy使用GNU BFD库去读或写目标文件.objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式 ...
- GNU Binutils工具
参考<程序员的自我修养---连接.装载与库> 以下内容转贴自 http://www.cnblogs.com/xuxm2007/archive/2013/02/21/2920890.html ...
- Open Source 开发工具集
Open Source 开发工具集 转自:http://www.linuxforum.net原作者:gogoliu(Pooh-Bah) 编辑器: vi:老牌编辑器,在各个unix和unix-like平 ...
随机推荐
- eclipse 如何修改maven插件本地仓库jar包默认存储位置
eclipse 如何修改maven插件本地仓库jar包默认存储位置 CreateTime--2018年4月18日11:04:47 Author:Marydon 1.更改eclipse的maven本 ...
- c#实现统计代码运行时间
方法一: //实例化一个计时器 Stopwatch watch = new Stopwatch(); //開始计时 watch.Start(); //此处为要计算的执行代码 for (int i = ...
- webservice系统学习笔记3-分析wsdl文件的组成
详细分析前面章节的服务的wsdl文件 1.http://localhost:8888/ws01?wsdl 2.http://localhost:8888/ws01?xsd=1 在接口服务中添加复杂类型 ...
- 突破单机多实例Elasticsearch
默认大家都是单机单实例es,在实验环境下想尽可能模拟各种场景.单机多实例就出来了... 实验拓扑图 01.es安装这里就不说了 详情:http://www.cnblogs.com/xiaochina/ ...
- 金山PDF
金山是个很不错的软件公司,金山出PDF,纯粹是完善生态圈!毕竟没FoxitReader专业对PDF的处理上! 官网:芝麻开门 下载:http://wdl1.cache.wps.cn/wps/downl ...
- TabLayout实现顶部导航(一)
代码地址如下:http://www.demodashi.com/demo/14552.html 前言 顶部导航栏,是我们在开发中比较常见的一种显示布局,它的实现可以有多种方式,那么今天我们就来讲讲 T ...
- 国内四大炒股软件APP 全面技术解析
随着人们的焦点逐步由电脑PC端转为手机端之后,国内炒股软件也逐步开始推出手机炒股APP,但是面对如此众多的都以“最牛.最佳”等冠名的APP真的实至名归吗?为了大家不再走弯路,不沉迷智能选股,笔者将近期 ...
- java多线程(二)之实现Runnable接口
一.java多线程方式2: 实现Runnable接口 好处:a. 可以避免由于java单继承带来的局限性. b. 适合多个相同的程序的代码去处理同一个资源的情况, 把线程与程序的代码, 数据有效分离, ...
- Windows右键菜单设置与应用技巧
http://blog.163.com/lee_honleon/blog/static/555251522008014258896/ 需要修改注册表,挺麻烦的.最好还是把迅雷卸了重装,不会影响什么 ...
- iOS开发Xcode8需要注意的那些坑
现在在苹果的官网上,我们已经可以下载到Xcode8的GM版本了,加上9.14日凌晨,苹果就要正式推出iOS10系统的推送了,在此之际,iOS10的适配已经迫在眉睫啦,不知道Xcode8 beat版本, ...