addr2line objdump命令使用方法

2023-11-06

如果是ROS 的 CMakeList.txt ,编译的时候需要加上一下选项,才可以生产debug版本,可以使用addr2line 定位问题。

catkin_make -DCMAKE_BUILD_TYPE=debug -DCATKIN_WHITELIST_PACKAGES="XXX"

 

还有一种方法是再CMakeList.txt 中加 SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") ,但是这种方法在ROS中好像不生效。

转自:https://blog.csdn.net/chrovery/article/details/48035235

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

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

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

 

[cpp] view plaincopy

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

 

使用

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

prebuilts/tools/gcc-sdk/addr2line -e out/target/product/z4dtg/obj/EXECUTABLES/xxxxx_intermediates/LINKED/xxxxxxxx  0x00007165

 

objdump同样可以用于debug crash问题

举例:

kernel中有如下crash

CPU: 0 PID: 155 Comm: khubd Tainted: P           O 3.10.79 #10
20151010_15:57:32:000[    3.788226] task: d2cae880 ti: d2d60000 task.ti: d2d60000
20151010_15:57:32:000[    3.793612] PC is at device_del+0x28/0x194
20151010_15:57:32:000[    3.797685] LR is at device_del+0x1c/0x194
20151010_15:57:32:000[    3.801767] pc : [<c01ae980>]    lr : [<c01ae974>]    psr: 200f0013

 

可使用

arm-linux-guneabihf-objdump -D vmlinux | less 将所有symbol dump出来,然后查找device_del function,看偏移0x28位置处具体为什么会导致crash

 

Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成很有意义的。
现在举一个具体的例子来说明addr2line具体用法,至于其他的特殊应用可以使用man来了解。
在一次系统死机的过程中,我们得到如下的信息,死机的模块是tejxapci.ko:
具体位置是:shtej_spanconfig+0x98/0x123
之后先使用#objdump -S tejxapci.ko 得到shtej_spanconfig的地址0x248a,加上0x98就是,0x2522
得到0x2522这个地址之后,运行#addr2line -e tejxapci -f 之后输入0x2522,addr2line就可以定位到对应的那一行代码了。

 

如果遇到objdump无法使用的情况,可以使用如下command来check ELF格式的bin档中的symbol list

readelf -s output/debug/vmlinux | grep xxx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

addr2line objdump命令使用方法 的相关文章

  • Ubuntu镜像下载地址

    镜像地址https launchpad net ubuntu cdmirrors
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • 在Ubuntu 14.04.2 LTS上安装Qt

    Qt是一个跨平台的应用程序框架 广泛用于开发具有GUI界面的应用软件以及命令行工具 几乎所有操作系统都可以使用Qt 如Windows Mac OS X Android等 用于开发Qt应用程序的主要编程语言是C 但是可以使用诸如Python
  • Fedora 启动顺序

    http hi baidu com wwwkljoel item 29620217882a585b2b3e2244 The start of the Fedora fedora 系统加电或复位后 中央处理器将内存中的所有数据清零 并对内存进
  • rosprofiler 安装和使用

    rosprofiler wiki 页面 http wiki ros org rosprofiler rosprofiler package 下载rosprofiler和ros statistics msgs 放到工程目录下编译 https
  • Raspberry Pi 上 ROS 服务器/客户端通过GPIO 驱动硬件

    ROS 服务 现在 想象一下你在你的电脑后面 你想从这个服务中获取天气 你 在你身边 被认为是客户端 在线天气服务是服务器 您将能够通过带有 URL 的 HTTP 请求访问服务器 将 HTTP URL 视为 ROS 服务 首先 您的计算机将
  • makeinfo: command not found解决方法

    sudo apt get install texinfo
  • 程序“catkin_init_workspace”尚未安装。 您可以使用以下命令安装: sudo apt install catkin

    程序 catkin init workspace 尚未安装 您可以使用以下命令安装 sudo apt install catkin 问题如图 先贴上解决后的效果 运行环境 ubuntu 16 04 ros版本 kinetic 问题解释 这个
  • 《机器人操作系统入门》课程代码示例安装出错解决方法

    问题描述 学习 机器人操作系统入门 课程时 在Ubuntu 16 04 上安装了kinetic 安装ROS Academy for Beginners时依赖总是报错 如下所示 rosdep install from paths src ig
  • Linux shell中if [ $? -eq 0 ] 语句作用:判断命令是否执行成功

    shell脚本中 是指上一次命令执行的成功或者失败的状态 如果成功就是0 失败为1 语句if eq 0 是判断if语句的上一个命令执行如果成功就执行if中的语句 否则就执行else中的内容 note 使用时要注意 if后面的中括号 eq 0
  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • 如何将从 rospy.Subscriber 数据获得的数据输入到变量中?

    我写了一个示例订阅者 我想将从 rospy Subscriber 获得的数据提供给另一个变量 以便稍后在程序中使用它进行处理 目前 我可以看到订阅者正在运行 因为当我使用 rospy loginfo 函数时 我可以看到打印的订阅值 虽然我不
  • 进入 docker 容器,exec 丢失 PATH 环境变量

    这是我的 Dockerfile FROM ros kinetic ros core xenial CMD bash 如果我跑docker build t ros docker run it ros 然后从容器内echo PATH 我去拿 o
  • 不使用ros编译roscpp(使用g++)

    我正在尝试在不使用ROS其余部分的情况下编译roscpp 我只需要订阅一个节点 但该节点拥有使用旧版本ROS的节点 并且由于编译问题 我无法将我的程序与他的程序集成 我从git下载了源代码 https github com ros ros
  • 我的代码的 Boost 更新问题

    我最近将 boost 更新到 1 59 并安装在 usr local 中 我的系统默认安装在 usr 并且是1 46 我使用的是ubuntu 12 04 我的代码库使用 ROS Hydro 机器人操作系统 我有一个相当大的代码库 在更新之前
  • 在 ROS - Python 中使用来自多个主题的数据

    我能够显示来自两个主题的数据 但无法在 ROS 中实时使用和计算这两个主题的数据 用 Python 代码编写 您有想法存储这些数据并实时计算吗 谢谢 usr bin env python import rospy import string
  • 可以在catkin工作区之外创建ROS节点吗?

    我想在catkin工作区之外创建一个ROS发布者节点 可以创建吗 当然可以 像对待任何其他 cpp 库或 python 包一样对待 ROS 在Python中你必须保留PYTHONPATH环境变量指向ros包 opt ros kinetic
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • 使用 CMake 链接 .s 文件

    我有一个我想使用的 c 函数 但它是用Intel编译器而不是gnu C编译器 我在用着cmake构建程序 我实际上正在使用ROS因此rosmake但基础是cmake所以我认为这更多是一个 cmake 问题而不是ROS问题 假设使用构建的文件

随机推荐

  • 51单片机指令系统详解

    指令系统 微型机的功能是由指令系统体现的 所以 寻址方式和指令系统是衡量微型机的重要指标 MSC 51的指令系统一共有111条指令 包括单字节49条 双字节46条和三字节16条 按周期分 有单周期 双周期和三周期指令 在晶振频率为12MHZ
  • 【问题记录系列】java.lang.IndexOutBoundsException:Index: 1,Size:1

    java lang IndexOutBoundsException 1 问题背景 2 问题展示 图片 拍摄图 3 问题解决 图片 debug图一 debug图二 4 解决后的效果 1 问题背景 昨天写好的重置密码的接口 与前端联调的过程中
  • Python opencv 机器学习 7. KMeans k值聚类 两个特征

    import cv2 import numpy as np from matplotlib import pyplot as plt 只有一个特征 只由人们的身高决定T恤大小 x np random randint 25 50 25 2 生
  • No module named ‘chinesecalendar‘

    在学习python的时候又遇见了这个问题 我cmd里面执行 pip install chinesecalendar 命令 执行结果出现successfully说明安装成功了 然后我又在 jupyter里进行 pip install chin
  • 实践:SSDEEP相似度比较

    2020 06 03 其实一开始的时候 我是想看看 他们都是使用什么特征来进行比较 今天下午就想找一些相关的相似度比较的文章 看看有没有相关的实践 然后发现谷歌出来的大量结果都是论文 我是想找一些实际的代码 不过 通过调整关键词到mediu
  • ARM编译器常用的预定义宏

    ARM编译器预定义了许多宏 这些宏提供有关工具链版本号和编译器选项的信息 编译器版本 宏为 ARMCC VERSION 数字形式呈现 使用方法如下 rt kprintf Compiler Version u r n ARMCC VERSIO
  • kudu集群Tablet Server异常:Check failed: _s.ok() Bad status: Service unavailable: Cannot initialize clock

    背景 CDH 6 3 1集群上kudu实例Tablet Server异常无法启动 根据报错信息提示时钟同步问题无法启动Check failed s ok Bad status Service unavailable Cannot initi
  • 串口模拟器VSPD(附VSPD安装包)

    串口通讯想必做硬件开发和软件的人来说都相当了解 以前的电脑 基本标配都包含一个串口 但现在的电脑 基本都没有配置串口了 如果要使用串口的功能 基本就要用一个USB转串口的硬件模块 虚拟串口 虚拟 COM 端口 应该很多人都知道 也就是一种模
  • 设计模式_19 状态模式(含 UML图 和 C++代码)

    设计模式 19 状态模式 19 状态模式 19 1 概念 19 2 结构 19 3 实现 19 3 1 UML图 19 3 2 代码 19 3 3 测试结果 19 4 优缺点 19 4 1 优点 19 4 2 缺点 19 5 使用场景 re
  • Mapper文件注入问题

    Mapper文件注入问题 UserMapper that could not be found 原因分析 解决方案 程序正常运行 但是注入类爆红问题 原因分析 解决方法 UserMapper that could not be found
  • Redirecting functions in shared ELF libraries

    Redirecting functions in shared ELF libraries By Apriorit Inc Anthony Shoumikhin 2 Apr 2010 4 83 13 votes Download elf h
  • 电感的两种模式——DCM和CCM的区别

    DCM断续模式 电流从零开始上升的三角波 CCM连续模式 电流从某一非零值上升的侧梯形波 波形不同 在变压器的初级电流 CCM模式波形为梯形波 而DCM模式为三角波 在变压器的次级整流管波形上 CCM同样为梯形 而DCM模式还是三角波 本质
  • JDK安装以及环境变量配置(操作步骤)

    JDK安装以及环境变量配置 操作步骤 安装包 一 环境准备 Windows10 jdk1 8 0 131 二 下载并安装JDK 安装包下载 三 环境变量配置 1 右键桌面上 我的电脑 gt gt 属性 在弹出的页面上点击 高级系统设置 2
  • C++无穷的表示

    在C 中 有时候会遇到无穷的情形 如何表示无穷 首先 C 每种数据类型都有固定的位数 从而可以用数值位全1来表示最大数据 C 本身也定义了一些这样的常量来供使用 如最大无符号整型数据是UCHAR MAX 十进制数为255 1十六进制数为0x
  • (PPO)近端策略优化学习记录

    PPO 近端策略优化学习记录 proximal policy optimization PPO 是策略梯度方法家族的一员 在PPO被提出来之前 它的哥哥 trust region policy optimization TRPO先被提出 在
  • python学习笔记(二)

    字符串格式化方式 二 Python除了 占位符的方法外 还有另一种高效的格式化语法 具体例子如下 有种JS模板字符串的感觉 通过语法 f 内容 变量 的格式来快速格式化 f的含义是format格式化 ee my name 66kk 3 14
  • Spring框架自学之路——简易入门

    目录 目录 介绍 Spring中的IoC操作 IoC入门案例 Spring的bean管理 配置文件 Bean实例化的方式 Bean标签的常用属性 属性注入 使用有参构造函数注入属性 使用set方法注入属性 注入对象类型属性 p名称空间注入属
  • selenium爬取京东商品信息

    开始编写代码之前你应了解ajax 和python基础语法和库 知道异步加载 熟悉html js 本人ide用的是vscode 浏览器是chrome python3 7 主要用到了selenium自动化测试工具 一 先看效果 这里以 手机 为
  • C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作

    文章目录 写在前面 哈夫曼树及哈夫曼编码的算法实现 实验内容 代码实现 图的基本操作 实验内容 代码实现 写在前面 本篇实验代码非本人写 代码源自外部 经调试解决了部分warning和error后在本地vs上可以正常运行 如有运行失败可换至
  • addr2line objdump命令使用方法

    如果是 的 CMakeList txt 编译的时候需要加上一下选项 才可以生产 版本 可以使用addr2line 定位问题 catkin make DCMAKE BUILD TYPE debug DCATKIN WHITELIST PACK