linux addr2line使用手册,addr2line 命令使用方法

linux addr2line使用手册,addr2line 命令使用方法在 Linux 下写 C C 程序的程序员 时常与 CoreDump 相见 在内存越界访问 收到不能处理的信号 除零等错误出现时 我们精心或不精心写就的程序就直接一命呜呼了 CoreDump 是 Linux 仁慈地留下的程序的尸体 帮助程序员们解决了一个又一个问题 有时配置不给力 Linux 直接毁尸灭迹 没有了 Core 文件 又有时 刚好磁盘空间不足 Core 文件写不下了 没有 Core 文件的时候 如何知道程序

在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: sp:7fff2add87e0 error:0 in test1[+1000]

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

$ addr2line -e test1 

/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 0x and Line by 1 to 6

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

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

for example:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212801.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:14
下一篇 2026年3月18日 下午7:14


相关推荐

  • OpenClaw 实战指南:手把手教你接入第三方 API (以 xingjiabiapi 为例) | 完美支持 Claude 3.5/4.5

    OpenClaw 实战指南:手把手教你接入第三方 API (以 xingjiabiapi 为例) | 完美支持 Claude 3.5/4.5

    2026年3月15日
    3
  • awk命令详解

    awk命令详解概述awk是专门为文本处理设计的编程语言,与sed类似都是以数据驱动的行处理软件,主要用于数据扫描、过滤、统计汇总工作,数据可以来自标准输入、管道或者文件。awk在20世纪70年代诞生与贝尔实验室。现在使用的版本是1988年发布的Gnuawk。基础语法记录与字段awk是一种处理文本文件的编程语言,文件的每行数据都被称为记录,默认以空格或制表符为分隔符,每条记录被分成若干字段(列),awk每次从文件中读取一条记录。语法格式:awk[选项]‘条件{动作}条件{动作}……’

    2022年7月11日
    30
  • 父类引用指向子类对象

    父类引用指向子类对象父类引用指向子类对象指的是 例如父类 Animal 子类 Cat Dog 其中 Animal 可以是类也可以是接口 Cat 和 Dog 是继承或实现 Animal 的子类 Animalanimal newCat 即声明的是父类 实际指向的是子类的一个对象 nbsp 那这么使用的优点是什么 为什么要这么用 可以用这几个关键词来概括 多态 动态链接 向上转型也有人说这是面向接口编程 可以降低

    2026年3月20日
    2
  • 时光网打不开的解决办法

    时光网打不开的解决办法2010年11月4日Update:时光网已回归.在C:\Windows\System32\drivers\etc文件夹中打开hosts文件,以文本格式打开。(Windows7和Vista可能需要复

    2022年7月2日
    28
  • 2026年AI智能体爆发式增长:技术落地加速,人才缺口凸显

    2026年AI智能体爆发式增长:技术落地加速,人才缺口凸显

    2026年3月17日
    2
  • 2021navicat激活码(注册激活)

    (2021navicat激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    710

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号