在Linux下写C/C++程序的程序员,时常与Core Dump相见。在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁慈地留下的程序的尸体,帮助程序员们解决了一个又一个问题。

有时配置不给力,Linux直接毁尸灭迹,没有了Core文件;又有时,刚好磁盘空间不足,Core文件写不下了。没有Core文件的时候,如何知道程序在什么地方出错了呢?addr2line就在这时派上用场。

这是一个示例程序,func函数返回参数a除以参数b的结果。这里使用0作为除数,结果就是程序因为除以0导致错误,直接中断了。

#include

intfunc(inta,intb)

{

returna / b;

}

intmain()

{

intx = 10;

inty = 0;

printf("%d / %d = %d\n", x, y, func(x, y));

return0;

}

使用

$ gcc -o test1 -g test1.c

编译程序,test1.c是程序文件名。执行程序,结果程序异常中断。查看系统dmesg信息,发现系统日志的错误信息:

[54106.016179] test1[8352] trap divide error ip:400506 sp:7fff2add87e0 error:0 in test1[400000+1000]

这条信息里的ip字段后面的数字就是test1程序出错时所程序执行的位置。使用addr2line就可以将400506转换成出错程序的位置:

$ addr2line -e test1 400506

/home/hanfoo/code/test/addr2line/test1.c:5

这里的test1.c:5指的就是test1.c的第5行

return a / b;

也正是这里出现的错误。addr2line帮助我们解决了问题。

addr2line如何找到的这一行呢。在可执行程序中都包含有调试信息,其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系Line Number Table。DWARF格式的Line  Number Table是一种高度压缩的数据,存储的是表格前后两行的差值,在解析调试信息时,需要按照规则在内存里重建Line Number  Table才能使用。

Line Number Table存储在可执行程序的.debug_line域,使用命令

$ readelf -w test1

可以输出DWARF的调试信息,其中有两行

Special opcode 146: advance Address by 10 to 0x4004fe and Line by 1 to 5

Special opcode 160: advance Address by 11 to 0x400509 and Line by 1 to 6

这里说明机器二进制编码的0x4004fe位置开始,对应于源码中的第5行,0x400509开始就对应与源码的第6行了,所以400506这个地址对应的是源码第5行位置。

addr2line通过分析调试信息中的Line Number Table自动就能把源码中的出错位置找出来,再也不怕Linux毁尸灭迹了。

for example:

linux addr2line使用手册,addr2line 命令使用方法相关推荐

  1. linux中的last命令,在Linux系统中使用Last命令的方法,包括Last命令选项说明

    如果您要管理多用户系统,则通常需要知道登录机器的人员.时间和来源.last是一个命令行实用程序,用于显示有关系统用户的最近登录会话的信息,当您需要跟踪用户活动或调查可能的安全漏洞时,此功能非常有用.本 ...

  2. linux 机器开机自动运行命令的方法

    [亲测可行]方法1: 在/etc/profile.d/下写bash文件 直接把sh脚本拷贝到/etc/profile.d/目录下即可 重启开机的时候,/etc/profile会遍历/etc/profi ...

  3. Linux系统中iotop源码安装,在Linux系统中安装iotop命令的方法

    Linux中的iotop命令主要用于显示硬盘IO,但该命令只存在于kernelv2.6.20之后的版本, 那么要如何安装iotop命令呢?下面小编就给大家介绍下如何在Linux上安装iotop命令. ...

  4. shell脚本循环执行一个linux命令,Linux中循环执行shell命令的方法

    Linux命令行,循环执行shell命令 死循环 命令格式while true ;do ; done; 可以将 command 替换为任意命令. 下面以echo "hello"; ...

  5. linux下gzip用法,Linux下tar和gzip命令的方法

    tar [选项] 压缩(解压缩)的文件名 选项:-c 建立新的归档文件 -r 向归档文件末尾追加文件 -x 从归档文件中解出文件 -O 将文件解开到标准输出 -v 处理过程中输出相关信息 -f 对普通 ...

  6. linux下使用无线网卡的命令行方法

    (1)首先关闭开发板的有线网卡 [root@FriendlyARM /]# ifconfig eth0 down (2)加载USB WiFi无线网卡 [root@FriendlyARM /]# ifc ...

  7. linux安全杀死命令,Linux操作系统下杀死进程命令的方法

    1. kill 作用:根据进程号杀死进程 用法: kill [信号代码] 进程ID 举例: [root@localhost ~]# ps auxf |grep httpd root 4939 0.0 ...

  8. [Linux Device Driver] QXDM diag命令发送方法

    通过USB连接设备之后,以下面格式在Command里面输入: send_data 0xff 0xfe 0xfc 0xf1 0xf3 0xf4 0xf5

  9. linux shell 当前用户名,在Linux中使用Whoami命令显示当前登录用户名称及替代命令的方法...

    本文介绍在Linux操作系统中使用Whoami命令的方法,顾名思义,whoami命令显示有效用户ID的用户名,换句话说,它显示当前登录用户的名称. 使用whoami命令的方法 whoami命令的语法如 ...

  10. hadoop如何使用linux命令,hadoop命令_Linux使用hadoop dfs命令的方法

    摘要 腾兴网为您分享:Linux使用hadoop dfs命令的方法,沃尔玛,顺丰小哥,省呗,七猫小说等软件知识,以及滴答音乐,sp期货,中油即时通信软件,7723游戏厅,键盘点击器,爱奇艺app视频, ...

最新文章

  1. 【好书试读】支付宝体验设计精髓
  2. 多人在线游戏服务器端开发心得(转)
  3. C++阶段01笔记02【数据类型(整型、sizeof关键字、实型(浮点型)、字符型、转义字符、字符串型、布尔类型 bool、数据的输入)】
  4. 分布式文件系统之MooseFS----管理优化
  5. 用css3实现ps蒙版效果+动画
  6. POJ 3311 Hie with the Pie (flyod + DFS枚举)
  7. 【51Nod - 1163】最高的奖励 (贪心+优先队列 或 妙用并查集)
  8. Spring Security构建Rest服务-1401-权限表达式
  9. jQuery:点击某元素后根据兄弟节点是否显示,控制兄弟节点的显示与否
  10. php针探,php针探代码,这款针探可以检测你机器的(1/7)
  11. 苏州十大IDC机房排名,苏州idc服务商实力排名
  12. dvd光驱在计算机内怎么找不到,为什么在我的电脑中找不到光驱了?
  13. 雷啊:淘宝上卖F22战斗机
  14. jzoj 3957 鸡腿の花园
  15. 如何旋转PDF页面?两招教你轻松搞定
  16. 用vue3.0.1如何搭建仿京东的电商H5项目呢?本文实战教你
  17. GOT-10k: A Large High-Diversity Benchmark forGeneric Object Tracking in the Wild(论文翻译)
  18. 台式计算机能装蓝牙吗,台式电脑没有蓝牙功能怎么安装
  19. mysql没有for循环语句(使用while替代)
  20. C语言单目运算符和双目运算符、三目运算符

热门文章

  1. dhtml gantt所有配置_dhtmlxGantt
  2. ubuntu最好用的划词翻译词典:有道词典和GoldenDict
  3. 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
  4. HTML是什么?HTML简介
  5. 双网口设备 网关设置注意事项
  6. 大数据清洗、转换工具——ETL工具概述
  7. LPDDR4协议规范之(二)复位和上电初始化
  8. 2017 matlab 仿真,【2017年整理】Simulink仿真教程.ppt
  9. CST微波工作室学习笔记—14.天线设计实例
  10. java实验报告9 面向接口编程