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

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

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

#include <stdio.h>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行

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毁尸灭迹了。

linux addr2line相关推荐

  1. linux addr2line,定位so文件崩溃代码行数

    当我们使用别人的ndk时,可能别人的so文件会崩溃,这个时候需要定位该so文件崩溃的代码的行数,即哪一行.方法如下: 1.找到ndk下面的该目录:D:\IT\AndroidStudio\SDK\ndk ...

  2. Linux / alignment trap - not handling instruction..

    概述 开始编辑日期:2018年12月26号,后重新整理从富文本编辑器转移至Markdown编辑器. 问题描述:Long Long Ago 嵌入式应用程序在现场使用时,小频次出现异常黑屏(进程死,Lin ...

  3. Linux下addr2line命令用法

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

  4. Linux驱动之oops错误:addr2line工具定位错误

    前言 在编写linux驱动程序时,最让人头疼的,莫不是内核发生了oops错误,并打印了一大堆错误信息如下: Unable to handle kernel NULL pointer dereferen ...

  5. Linux调试之(三)addr2line+vmlinux

    文章目录 Linux调试之(三)addr2line+vmlinux [1] addr2line位置 [2]addr2line使用 [1] 说明是空指针造成的错误 [2] 寄存器信息主要是PC的值 [3 ...

  6. linux 内核 addr2line,Android或Linux调试addr2line工具锁定命令的使用

    关于调试:调试中addr2line命令的使用. 问题引出:i850的wifi定位开启后,在使用goole maps时出现rootfs重启现象,打印的log信息如下: ///////////////// ...

  7. Linux 命令之 addr2line

    先上程序 #include <stdio.h> int divide(int a, int b) {return a/b; }int main() {fprintf(stdout, &qu ...

  8. linux定位so快捷方式_使用addr2line命令定位到行号解析.so的文件

    一.背景 最新遇到crash 的问题 ,这里来简单说明怎么使用addr2line 命令来定位问题 首先获取到tombstone log 找到出现的位置如下log Process Name: 'UNKN ...

  9. 在Linux中打印函数调用堆栈【原创】

    本人学习笔记,代码参考如下网址 参考http://www.cnblogs.com/dma1982/archive/2012/02/08/2342215.html zhangbh@prolin-srv: ...

最新文章

  1. vue及脚手架的下载安装,创建项目
  2. SAP ABAP 平台新的编程模型
  3. Pycharm中设置py文件头部注释信息
  4. 怎样运用Oracle的BFILE
  5. 电芯容量在前期循环中容量增加_锂离子电池容量“跳水”背后元凶找到了!——非均匀压力...
  6. mqtt 多个订阅者 只允许一个接收_一文读懂物联网的灵魂MQTT
  7. 有道词典Mac版崩溃信息
  8. GridView控件常见问题及处理方法
  9. 频繁项集挖掘算法之FPGrowth
  10. alisql mysql_alisql|alisql数据库下载 v5.6 官方版_小皮网
  11. ubuntu默认播放器缺少解码器
  12. 全国基础地理数据库数据预处理
  13. 论文笔记 Question Answering over Freebase via Attentive RNN with Similarity Matrix based CNN
  14. hoolilaw解读:在美国如何应对交通罚单
  15. 微信如何开通直播?开通方法有2种
  16. VS:如何离线使用Nuget安装包
  17. STM32 KEIL软件设置程序烧写起始地址选择
  18. hda vs sda
  19. Python | 如何运行.ipynb文件?如何安装Jupyter notebook?
  20. 生命如歌-五年级每日一记

热门文章

  1. h5点击后字体加粗出现下边框_人力资源管理论文格式(字体+版式+打印)
  2. Intel Realsense d435 使用python对深度图进行预处理
  3. 如何解决pd16虚拟机 mac 联网失败问题?pd16 m1芯片版网络初始化失败问题!
  4. 信奥中的数学:前缀和与差分、大整数开方技巧
  5. 14怎么敷铜不了_YEO护肤课堂:敷面膜有什么误区?我们应该如何选择面膜?
  6. 人工智能python课程总结1500字_李开复的《人工智能》读后感1500字
  7. Linux基础学习九:Mysql读写分离原理以及详细搭建步骤
  8. vue-router路由安装与使用
  9. dedecms调用某一顶级栏目下二级标签
  10. python实例属性引用-python之对象(实例)