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

具体操作方法:

1. 准备一个elf文件,如zephyr.elf;

2. 将zephyr.elf反汇编为asm: objdump -D  -m arm zephyr.elf >zephyr.elf.asm;

3.使用readelf -w zephyr.elf | grep "advance Address"搜索出zephyr.elf文件中地址号与代码行对应关系:
  Special opcode 7: advance Address by 0 to 0x1032ad4 and Line by 2 to 28
  Special opcode 33: advance Address by 4 to 0x1032ad8 and Line by 0 to 28
  Special opcode 39: advance Address by 4 to 0x1032adc and Line by 6 to 149
  Special opcode 23: advance Address by 2 to 0x1032ade and Line by 4 to 153
  Special opcode 15: advance Address by 2 to 0x1032ae0 and Line by -4 to 149
  Special opcode 20: advance Address by 2 to 0x1032ae2 and Line by 1 to 150
  Special opcode 22: advance Address by 2 to 0x1032ae4 and Line by 3 to 153
  Special opcode 30: advance Address by 4 to 0x1032ae8 and Line by -3 to 150
  Special opcode 20: advance Address by 2 to 0x1032aea and Line by 1 to 151
  Special opcode 21: advance Address by 2 to 0x1032aec and Line by 2 to 153
  Special opcode 17: advance Address by 2 to 0x1032aee and Line by -2 to 151
  Special opcode 20: advance Address by 2 to 0x1032af0 and Line by 1 to 152
  Special opcode 34: advance Address by 4 to 0x1032af4 and Line by 1 to 153
  Special opcode 35: advance Address by 4 to 0x1032af8 and Line by 2 to 155
  Special opcode 13: advance Address by 0 to 0x1032af8 and Line by 8 to 163
  Special opcode 48: advance Address by 6 to 0x1032afe and Line by 1 to 164
  Special opcode 14: advance Address by 2 to 0x1032b00 and Line by -5 to 159

选取一行进行地址与代码行及函数名文件名映射:

addr2line 1032ad4 -e zephyr.elf -f -s -C或者addr2line 0x1032ad4 -e zephyr.elf -f -s -C回车执行结果如下:

serialize_raw_is_checksum_ok
serialize_raw.h:28

至此可以看到在zephyr.elf文件中地址0x1032ad4所对应的函数为serialize_raw_is_checksum_ok,在serialize_raw.h头文件的第28行处!

此时如果当系统运行时报出0x1032ad4地址错误,则可以立即定位出是serialize_raw.h头文件的第28行的serialize_raw_is_checksum_ok出现了问题!

验证:

调出zephyr.elf所在工程原文件,果然搜索到serialize_raw.h第28行,其内容为:

原理

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

addr2line工具使用相关推荐

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

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

  2. addr2line工具的作用

    功用: addr2line可以将函数地址解析为函数名: addr2line根据地址获取到对应的代码行: addr2line参数: addr2line工具位置(Android源码): Crash log ...

  3. Keil环境下STM32定位hardfault位置方法(addr2line工具)和遇到的情况

    目录 一.概述 二.方法一:Call Stack + Locals 三.方法二:Show Code at Address 3.1 需要通过LR判断SP? 3.1.1 关于MSP和PSP 3.1.2 为 ...

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

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

  5. ndk addr2line工具的使用

    addr2line是一个十分有用的debug工具,这个工具在ndk的安装目录下就有 在ndk \toolchains\aarch64-linux-android-4.9\prebuilt\window ...

  6. addr2line 工具

    addr2line : 顾名思义  address to line 1.将ndk中的arm-linux-androideabi-addr2line可执行文件的路径加入配置文件~/.bashrc中,例如 ...

  7. 【软件开发底层知识修炼】六 Binutils辅助工具之- addr2line与strip工具

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 上一篇文章我们学习了gcc编译器的相关内容.点击查看上一篇文章:gc ...

  8. Binutils工具集 GCC工具集介绍

    GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...

  9. addr2line命令

    ❤️强烈推荐人工智能学习网站❤️ linux下addr2line工具事一个可以将指令的地址和可执行文件映像转换成文件名,函数名和源代码行数的工具.add2line独起来就是addr to line,即 ...

  10. Linux二进制实用工具Binutils工具集解析()

    From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...

最新文章

  1. 《LeetCode力扣练习》第617题 合并二叉树 Java
  2. Skype For Business 2015实战系列6:后端数据库安装CU6补丁
  3. 职场中晋升最快的人具有什么特点?隐藏不住的四大特征
  4. bilibili基于 Flink 的机器学习工作流平台在 b 站的应用
  5. Django2.+ path配置
  6. 怎么用计算机算p a,老师,(P/A,12%,10)这个值用计算器怎么算出来?
  7. linux内核深度解析_十年磨一剑,第一本龙芯平台的Linux内核书来了
  8. 腾达A6无线路由器的几种连接模式
  9. 深度学习技术干货免费听,AirPods2任性抽...520有场AI峰会不可错过!
  10. Python 揭秘斐波那契定律,如何帮助码农分析股票?| 技术头条
  11. 福利 | 干大事,成大事,2018 幸福如是!
  12. 【5分钟 Paper】Playing Atari with Deep Reinforcement Learning
  13. 图片延迟加载(lazyload)的实现原理
  14. Pyqt之QApplication
  15. 串口485接法图_RS485通讯的正确接线方式介绍
  16. H5-表格的基本样式
  17. 计算机主机电源品牌有哪些,电脑电源的一线品牌有哪些?
  18. 第二章 AIR202_Lua_串口控制
  19. 如何用电脑制作VR全景图
  20. 第二期:关于十大数据相关问答汇总,关注持续更新中哦~

热门文章

  1. 数学分析原理 定理 6.10
  2. 对称正定矩阵的Cholesky分解
  3. cdr添加节点快捷键_CDR常用快捷键有哪些
  4. 图片验证码的实现方法
  5. android mac地址过滤,android手机怎么更改mac地址绕过mac过滤
  6. 【软件资源】VS2013软件安装全教程!(附VS各版本下载地址)
  7. LPDDR4协议规范之(二)复位和上电初始化
  8. CSS 巧妙实现文字二次加粗再加边框
  9. NCRE一到四级的刷题软件
  10. 图灵奖得主亲授!深度学习视频课程精选