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

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

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

    [cpp] view plaincopyprint?
  1. #include <STDIO h="">
  2. int func(int a, int b)
  3. {
  4. return a / b;
  5. }
  6. int main()
  7. {
  8. int x = 10;
  9. int y = 0;
  10. printf("%d / %d = %d\n", x, y, func(x, y));
  11. return 0;
  12. }
  13. </STDIO>
#include int func(int a, int b)
{return a / b;
}int main()
{int x = 10;int y = 0;printf("%d / %d = %d\n", x, y, func(x, y));return 0;
}

使用

$ 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行

[cpp] view plaincopyprint?
  1. return a / b;
  return a / b;

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

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

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

$ readelf -w test1

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

[plain] view plaincopyprint?
  1. Special opcode 146: advance Address by 10 to 0x4004fe and Line by 1 to 5
  2. Special opcode 160: advance Address by 11 to 0x400509 and Line by 1 to 6
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毁尸灭迹了。

转载于:https://www.cnblogs.com/li-hao/archive/2013/04/03/2997807.html

addr2line探秘相关推荐

  1. addr2line探秘(没有core怎么办)

    转自:http://www.cnblogs.com/li-hao/archive/2013/04/03/2997807.html 在Linux下写C/C++程序的程序员,时常与Core Dump相见. ...

  2. Linux下addr2line命令用法

    Linux下addr2line命令用于将程序指令地址转换为所对应的函数名.以及函数所在的源文件名和行号.当含有调试信息(-g)的执行程序出现crash时(core dumped),可使用addr2li ...

  3. C++ 调试技术:addr2line

    最常用的调试C++程序的方法是使用IDE,比如说vs,clion.打断点,debug模式跑. 稍微先进一点的是使用gdb进行调试. gdb调试使用到的技术就比较多了,以后详细介绍. 今天看到一个神奇的 ...

  4. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  5. 51CTO专访人人网黄晶:SNS网站后台架构探秘

    [51CTO独家专访]51CTO在此之前报道过一篇名为<世界最大的PHP站点 Facebook后台技术探秘>的文章,让我们了解到Facebook是如何保证5亿用户的系统一直保持稳定.可靠运 ...

  6. 探秘早期的FPGA内部构造

    早期的FPGA结构介绍: FPGA(field-programmable gate array),即现场可编程门阵列.它与其他集成电路的不同之处在于它的可编程特性. 下面对早期FPGA构造的介绍来自于 ...

  7. 可视化工具gephi源码探秘(二)---导入netbeans

    在上篇<可视化工具gephi源码探秘(一)>中主要介绍了如何将gephi的源码导入myeclipse中遇到的一些问题,此篇接着上篇而来,主要讲解当下通过myeclipse导入gephi源码 ...

  8. MySQL探秘(七):InnoDB行锁算法

     在上一篇<InnoDB一致性非锁定读>中,我们了解到InnoDB使用一致性非锁定读来避免在一般的查询操作(SELECT FOR UPDATE等除外)时使用锁.然而锁这个事情是无法避免的, ...

  9. 探秘网络背后黑产链:黑客攻击木马病毒机构内鬼防不胜防

    电子商务.移动支付的普及,消费者越来越少随身携带现金,人们打趣道"小偷都快失业了". 但在互联网上,靠盗窃用户电子账户资金.虚拟资产的"网络小偷"却十分猖獗. ...

最新文章

  1. Hadoop虚拟机的jdk版本和本地eclipse的版本不一致怎么办
  2. Opera浏览器同步服务被黑,用户数据和存储密码泄露
  3. c++——结构与指针 类与指针
  4. SAPScript和Smartform双面打印
  5. Linux文件(目录)命名规则
  6. 基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)
  7. bzoj 3513: [MUTC2013]idiots FFT
  8. 《流畅的Python》读书笔记——Python使用一等函数实现设计模式
  9. Can't use Subversion command line client: svn Probably the path to Subversion executable is wrong
  10. 踩坑内核参数tcp_tw_recycle
  11. 怀念WAP网站和让IE浏览器支持WAP网站
  12. 使用labview制作漂亮的按钮
  13. FTP工具 CuteFTP Pro使用方法
  14. 博微软件网络服务器安装,负载均衡服务器nginx详细安装教程及网络部署
  15. 2021年低压电工考试题及低压电工模拟考试
  16. 26 图的邻接矩阵:深度优先遍历
  17. 输出三角形字符阵列图形(C语言)
  18. AutoIt上路03-添加工具栏
  19. 【网络安全专栏目录】--企鹅专栏导航
  20. Pocket PC 基础知识

热门文章

  1. Git操作失败并提示Another git process seems to be running in this......
  2. 微信小程序秀才成语接龙趣味答题小游戏带流量主无授权源码
  3. readonly和const比较
  4. 你的第一个 iOS 应用 – 2.开始上手
  5. CLR via C# 读书笔记 5-5 预留大内存
  6. MongoDB 教程四: 高级更改操作
  7. 使用jQuery开发一个基于HTML5的漂亮图片拖拽上传web应用
  8. Linux 性能监测
  9. Python_操作txt、xls、csv、PDF
  10. C++ 封装DLL遇到的一些坑爹问题与解决方案