addr2line工具是一个可以将指令的地址和可执行映像转换为文件名、函数名和源代码行数的工具。这在内核执行过程中出现崩溃时,可用于快速定位出出错的位置,进而找出代码的bug。

用法
addr2line [-a| --addresses ] [-b bfdname | --target=bfdname] [-C | --demangle[=style]] [-e filename | --exe=filename] [-f | --function] [-s | --basename] [-i | --inlines] [-p | --pretty-print] [-j | --section=name] [-H | --help] [-V | --version] [addr addr …]

参数
-a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。
-b --target=:指定目标文件的格式为bfdname。
-e --exe=:指定需要转换地址的可执行文件名。
-i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
-j --section=:给出的地址代表指定section的偏移,而非绝对地址。
-p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。
-s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。
-f --functions:在显示文件名、行号输出信息的同时显示函数名信息。
-C --demangle[=style]:将低级别的符号名解码为用户级别的名字。
-h --help:输出帮助信息。
-v --version:输出版本号。

使用
1.自己查找一个地址,然后来定位

#include<stdio.h>
int divide(int x, int y)
{
return x/y;
}

int main()
{
printf(“hello world\n”);
int x = 3;
int y = 0;
int div = divide(x, y);
printf("%d / %d = %d\n", x, y, div);
return 0;
}
编译:
g++ -Wl,-Map=test.map -g test.cpp -o test

查找divide函数的地址
grep divide test.map

0x00000000004005e7 divide(int, int)
使用addr2line定位
addr2line 0x00000000004005e7 -e test -f -C -s

divide(int, int)
test.cpp:3
如果不加-C选项,输出如下(是未经过demangle的)

_Z6divideii
test.cpp:3
2.查找系统信息,然后定位代码
dmesg

[150100.451504] traps: test[7593] trap divide error ip:4005f5 sp:7ffeebd4ba70 error:0 in test[400000+1000]
这条信息里,ip(指令指针寄存器)字段后面的数字就是test程序出错时程序执行的位置。使用addr2line就可以将4005f5定位到代码的位置:
addr2line 4005f5 -e test -f -s -C

divide(int, int)
test.cpp:4
第4行也就是除以0的位置:return x/y。

原理
addr2line如何找到的这一行呢。在可执行程序中都包含有调试信息(所以编译的时候需要加-g选项),其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系Line Number Table。Line Number Table存储在可执行程序的.debug_line域。
使用如下命令
readelf -w test | grep “advance Address”

[0x000000ca] Special opcode 7: advance Address by 0 to 0x4005e7 and Line by 2 to 3
[0x000000cb] Special opcode 146: advance Address by 10 to 0x4005f1 and Line by 1 to 4
[0x000000cc] Special opcode 104: advance Address by 7 to 0x4005f8 and Line by 1 to 5
[0x000000cd] Special opcode 36: advance Address by 2 to 0x4005fa and Line by 3 to 8
[0x000000ce] Special opcode 118: advance Address by 8 to 0x400602 and Line by 1 to 9
[0x000000cf] Special opcode 146: advance Address by 10 to 0x40060c and Line by 1 to 10
[0x000000d0] Special opcode 104: advance Address by 7 to 0x400613 and Line by 1 to 11
[0x000000d1] Special opcode 104: advance Address by 7 to 0x40061a and Line by 1 to 12
[0x000000d3] Special opcode 20: advance Address by 1 to 0x40062c and Line by 1 to 13
[0x000000d5] Special opcode 132: advance Address by 9 to 0x400646 and Line by 1 to 14
[0x000000d6] Special opcode 76: advance Address by 5 to 0x40064b and Line by 1 to 15
观察第二行和第三行,源代码的第4行的指令起始地址是0x4005f1, 第5行的起始地址是0x4005f8,可以知道0x4005f5位置的指令是属于第4行代码的。

linux下addr2line详解相关推荐

  1. Linux下命令详解(-)

    linux 下的命令详解 今天的是linux下tar包的打包和解包  打包并压缩  解包解压缩的命令详解 要是有不对的地方请各位指正,和有补充的请留言 在此表示感谢 By:黑风 打包 (把多个文件放在 ...

  2. Linux下task_struct详解

       背景:为了管理进程,操作系统必须对每个进程所做的事情进行清楚地描述,为此,操作系统使用数 据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块. 在linux系统中,这就 ...

  3. Oracle10g在linux下安装详解

    Oracle数据库我想大家都知道我在这里就不多介绍了,它也有很多的版本,我们今天来安装一下oracle10g,根据我的理解oracle数据库大部分都安装在linux下,所以我们就在linux下来安装o ...

  4. 登陆linux主机提示all,修改 linux 的命令行提示符PS1-限制IP通过SSH登陆linux服务器-linux下系统服务详解_169IT.COM...

    很多朋友可能对windows下的服务比较了解,但对于linux下的系统服务(守护进程)可能有些陌生. 这里收集了57个linux下的系统服务的详细解释,供大家学习参考. 1. NetworkManag ...

  5. linux路由表命令,linux下路由表详解

    主机想要发送数据的时候,参考的对象就是路由表. 如果两个不同网段的主机想要发送数据,经过的具体的经过: 1.查询IP数据包的目标IP地址,主机会查阅Ip数据包报头的目标IP地址. 2.查询是否存在与本 ...

  6. linux setcap指令,Linux下setcap详解

    为啥要讲setcap这个玩意呢,因为最近在做国产化系统编译安装产品,遇到普通用户下Nginx不能够小于1024一下端口的问题. CAPABILITIES(7) 文档有一段: For the purpo ...

  7. linux下udev详解

    一.udev简介 udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件.udev在用户空间运行,而不在内核空间 运行.它能够根据系统 ...

  8. LINUX下 Udev详解

    如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...

  9. Linux下log详解

    日志文件的默认路径是:/var/log 下面是日志文件的路径及其包含的信息: /var/log/syslog:它和/etc/log/messages日志文件不同,它只记录警告信息,常常是系统出问题的信 ...

  10. Linux下Awk详解(转载)

    什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务 ...

最新文章

  1. 使用主机telnet远程管理路由器和交换机的详细过程及截图
  2. vue过渡和animate.css结合使用
  3. 使用 IntelliJ IDEA 查看类图,内容极度舒适
  4. Go 变量及基本数据类型2
  5. LDAP用户验证(Spring-LDAP)
  6. Xah Lee Web 李杀网
  7. uoni扫地机器人好用吗_抖音走红的日本uoni尤利扫地机器人好吗?体验感如何?...
  8. 蚂蚁金服数据可视化引擎 G2 4.0 正式版发布!
  9. linux buffer cache 过高_怎么理解内存中的Buffer和Cache?
  10. 关于OATUH中的AUTHRAZITON CODE和TOKEN的关系,实际上就是这么回事
  11. C语言实现两个数值互换
  12. oracle报表工具查询数据太慢优化方案,页面优化和sql优化
  13. php中求10递归算法,PHP递归算法的应用(含示例)
  14. 通过虚拟机安装Ubuntu系统到移动硬盘
  15. 数据安全法下,企业如何平衡数据安全合规与业务性能?| 产业安全专家谈
  16. 华为line服务器无响应,line注册链接不到服务器
  17. 微信在后台疯狂读取用户隐私?专家:乌龙!是苹果系统升级的锅...你怎么看?...
  18. GPT-3有多强?伯克利小哥拿它写“鸡汤”狂涨粉,还成了Hacker News最火文章?!
  19. [GWCTF 2019]pyre
  20. [32位汇编系列]004 - 对话框资源的使用(2)

热门文章

  1. 24个笔画顺序表田字格_PPT 笔画书写动画,这样可以快速制作哦
  2. CentOS7+华为交换机+Winserver2012配置KMS服务器开机自启和自动激活
  3. java分层ppt_java程序设计第10章图形用户界面.ppt
  4. 数据库系统和数据库管理系统的定义以及数据库管理系统的作用
  5. 银发经济崛起:什么才是“收割”老年人的正确姿势?
  6. java计算机毕业设计ssm拼团旅游系统element 前后端分离
  7. 怎样在电脑中添加pdf打印机 添加pdf打印机的方法
  8. VS2013 community 官方版下载
  9. Origin Pro 8.5绘图导出图片空白边距问题
  10. 总时差与自由时差的计算