addr2line输出问号怎么办

2023-11-06

前言

使用backtrace等工具将程序异常运行的堆栈打印出来,然后再结合使用addr2line将堆栈地址转为文件行,将对于定位故障非常有帮助,但有时使用addr2line却输出为??:0 !

从addr2line的man手册中看确实没有分C和C++语言的区别,而且还有特殊的选项-C针对于C++编译器的函数重命名,所以,输出??:0 ,应该是找不到对应行号了,特别是使用地址信息的不正确。

结合个人实践,将对backtrace输出的地址信息进行分类!

backtrace显示地址分类

/lib/x86_64-linux-gnu/libc.so.6(clone+0x43) [0x7faf347b3133]

  • **()**中携带的地址信息为模块内地址,分为+0x0ffsetsymbol+0x0ffset两种情况,其中+0x0ffset可以直接作为addr2line的地址参数;symbol+0x0ffset地址在多几步处理后,可以作为addr2line的地址参数,特别是结合objdump -D工具。
  • **[]**中携带的地址为函数运行时地址,所以,一般是不能直接用的

在没有**()内地址信息时,[]**的地址可以作为地址参数

如果您确定堆栈信息与运行程序和依赖库是一致的话,且程序携带-g的调试信息,那么可以深入使用objdump -D工具进行人工分析。

-rdynamic

-rdynamic编译选项,从个人实践来看,作用被夸大了。携带此参数后,显示出来的symbol+0ffset的地址信息,无法直接作为addr2line的地址参数,去掉选项后,反而得到了能够直接使用的(+0xOffset)的地址

对于动态库的适应

如果SO库本身携带有调试信息的话,同样可以用addr2line -e /path/to/so addr,定位到SO库某文件中的某行。

[]地址的特殊性

从一个很小的青蛙例子,可以backtrace打印出**类[]的地址,多运行几次发现类[]**地址存在动态变化,所以,不能直接作为addr2line进行使用。反而是(+0xOffset)(Symbol+0xOffset)的地址非常稳定,比较适合作为addr2line的参数进行使用!

(+0xOffset)中的0xOffset可以直接作为addr2line的地址参数来使用

symbol+0xffset地址结合objdump

纯手工计算

   # template
   objdump -D /path/to/relocatable_object | grep -A20 ‘symbol’

   # example 
   objdump -D a.out |grep -A20 'main'

   # output
   ...
    0000000000003920 <main>:
    3920:	f3 0f 1e fa          	endbr64 
    3924:	55                   	push   %rbp
    3925:	48 89 e5             	mov    %rsp,%rbp
    3928:	53                   	push   %rbx

# 对于解析不出来的symbol+0xOffset进行特殊处理,特别关注<symbol>的位置
# 对于无法识别的`addr2line -e a.out main+0x1fc`

addr2line -e a.out $(printf '%x' $((0x3920 + 0x1fc)))
  • objdump -D将程序或库进行汇编输出,可以看到符号在模块内的地址
  • grep -A选项打印匹配行后多少行;另外,-C为匹配行的上下多少行,-B为匹配行前多少行,在监控动态输出日志时非常有帮助

固化

#!/bin/bash
# file: queryRowNo.sh

addr="$2"

name=${addr%+*}
offset=${addr#*+}

base=$(objdump -D $1 | grep "<$name>" | awk '{print $1}')

if [ -z "$base" ]; then
  echo "can't get the base addr of $name"
  exit
fi

base="0x$base"

addr2line -e "$1" $(printf '%x' $((base + offset)))

# example using shell script file
./queryRowNo.sh /lib/libACE.so.6.5.19 _ZN15ACE_Sig_Handler8dispatchEiP9siginfo_tP10ucontext_t+0x55

参考

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

addr2line输出问号怎么办 的相关文章

  • CoAP数据包的大小是多少?

    我是这项技术的新手 有人可以帮助我了解一些疑问吗 Q 1 CoAP数据包的大小是多少 我知道有 4 字节固定标头 但是包括标头 选项和负载在内的最大大小限制是多少 Q 2 有像MQTT那样的Keep Alive的概念吗 它在UDP上工作 它
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

    如何确定是否可以将给定数量的字节写入文件句柄 实际上是套接字 或者 如何 取消读取 我从其他文件句柄读取的数据 我想要类似的东西 n how much can I write w handle n read r handle buf n a
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • Gearman,php 扩展问题:使用终端在 .. 中找不到类“GearmanWorker”,但可以在浏览器上使用

    我最近在 ubuntu 10 04 上安装了 gearman 并安装了它的 pecl 扩展 现在 当我在浏览器中运行一个 php 文件时 其中包含 client new GearmanWorker die var Dump client I
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • Web 应用程序的带宽和流量模拟器?

    您能否建议如何创建一个测试环境来模拟 Web 应用程序中的各种类型的带宽和流量 或者也许是一个针对本地主机执行此操作的开源程序 我认为在编写网络应用程序时这是一个非常重要的主题 但这不是一个常见的主题 我能想象创建这种环境的唯一方法是在本地
  • 在 Linux 上访问 main 之外的主要参数

    是否可以访问参数main在外面main 即在共享库构造函数中 在 Linux 上除了通过解析之外 proc self cmdline 您可以通过将构造函数放入 init array部分 功能在 init array 不像 init 使用相同

随机推荐

  • Mybatis 入门

    1 Mybatis 项目构建 新建数据库 CREATE DATABASE mybatis USE mybatis DROP TABLE IF EXISTS user CREATE TABLE user id INT 20 NOT NULL
  • 多元共进|拓宽知识边界,持续增长技能

    在开放且迅速迭代的技术生态中 开发者面临着无限的机遇 与此同时 开发者的知识储备和技能水平也被赋予了更高的期待 2023 Google 开发者大会与开发者们共享了技术新知 也同步提供持续更新的学习资源 包括可以上手实践的课程和练习 加深开发
  • python+opencv+numpy入门

    一 简介 python是一门编程语言 由于其可以调用很多科学计算包 如numpy scipy matplotlib等而功能强大 numpy是python可调用的科学计算包 主要用于矩阵运算 它是python的数值计算扩展 这种工具可用来存储
  • STM32软件加密

    摘要 知识产权的保护 如何让自已辛勤的劳动成果不被别人抄袭 采用有效的手段对IC加密是值得每一个设计者关注的问题 当然 有人说 没有解不了密的IC 的确 解密是一项技术 只要有人类在不断的研究 它就有破解的一天 但是加密后的IC会增加破解的
  • 【数据库实验报告】关于SQL Server 简单的使用

    关于SQL Server 简单的使用 1 登陆SSMS 首先登陆 之前开启了sa账户 现在使用sa账户登陆 2 创建数据库 右键数据库 点击新建数据 输入数据库名称 然后确定 这个时候 已经新建了一个数据库了 现在在左侧管理器中 就可以看到
  • CaffeineCache基本使用 & SpringBoot集成缓存

    文章目录 一 常用API 1 get 2 getAll 3 refresh 二 缓存回收 清除 1 显式回收 2 隐式回收 2 1 基于容量 2 2 基于时间 2 3 基于引用 2 4 基于权重 三 刷新缓存 reload 四 监听器 五
  • 机房建设--服务器机柜尺寸参考

    自建或托管机房中常用的机柜规格为19英寸机柜 宽度 48 26cm 42U高度 1Unit 4 445cm 1 75英寸 选购需注意服务器机柜的进深通常为800mm 19英寸机柜尺度参考 称号 类型 规范尺度 mm 高 宽 深 备注 标准机
  • pktgen网络测试工具介绍

    pktgen是一款网络测试工具 可以用于压力测试 性能测试 负载均衡测试等方面 它使用Lua脚本来生成和发送数据包 并且支持多线程处理 pktgen可以在Linux系统上运行 支持多种协议和数据包类型 如TCP UDP ICMP ARP等
  • 砕月~イノチ~ - 小森きり

    From 我爱二次元 虾米电台 http www xiami com u 5627589 spm a1z1s 6626017 1561534497 3 3qsa0i Vocal 小森 Arranger 妄想放出所 haru 山野 原曲 砕月
  • 硬链接和软链接的区别和作用

    首先说说目录的本质和节点的概念 在linux系统下一切皆文件 目录它也是一个文件 只不过在它里面存储的是 一张表的文件 而节点就类似我们c语言中学过的数组的下标 我们可以把每个文件都看成是 数组中的元素 而知道了节点号 就可以找到实质的文件
  • office文档转pdf服务 本地或远程 OpenOffcie、LibreOffcie

    网上说 转的主流是 jacod和 aspose aspose是商用软件 跨平台 不需要第三方软件 jacod依赖 windows环境 在linux下需要安装openOffice 结果走了弯路 以为破解版的aspose好使 windows下好
  • 创业之初一般是怎么死的?写的非常好。。。。。

    转自 http xueyuan cyzone cn gushi ganwu 239865 html 我自己年轻的时候也创过业 条件很好 最后也失败了 后来做投资 看到的创业者就更多 最后发现自己有了丰富的创业失败经验 于是就比较适合写这篇创
  • Springcloud nacos install配置文件没有在target的classes里生成

    这是最近接手的一个springcloud的项目 在install编译的时候 target里面没有对应的nacos的配置文件 导致项目启动不起来 刚开始我也和大家一个都会搜索idea maven编译的时候install后target里面没有生
  • 数据结构——平衡树【2-3查找树、红黑树】

    查找树 查找树的定义 一棵标准的二叉查找树中的结点称为2 结点 含有一个键和两条链 而现在我们引入 3 结点 含有两个键和三条链 2 结点 含有一个键 及其对应的值 和两条链 左链接指向 2 3 树中的键都小于该结点 右链接指向的 2 3
  • ES 模糊查询 实现像Mysql like %%那样的模糊查询

    BoolQueryBuilder boolQueryBuilder QueryBuilders boolQuery WildcardQueryBuilder wildcardQueryBuilder QueryBuilders wildca
  • Javaweb基础-Servlet前后端交互

    eclipse创建好html文件和servlet之后得到如下页面 前端html 1 首先在html中引入Jquery 把下面的代码插入到head标签下 2 之后编写我们的前端html内容 在body标签内编写一下内容 用户名
  • http九大内置对象和四大作用域

    九大对象 application ServletContext 服务器启动后就产生了这个对象 所有客户共享这个内置的application 重中之中 request HttpServletRequest ServletResponse 封装
  • 寻找重复数

    lettCode 287 寻找重复数 给定一个包含 n 1 个整数的数组 nums 其数字都在 1 到 n 之间 包括 1 和 n 可知至少存在一个重复的整数 假设只有一个重复的整数 找出这个重复的数 示例 1 输入 1 3 4 2 2 输
  • Stata对cgss2017数据实证分析,希望有经验能帮忙的小伙伴多多指导。

    Stata是一款统计软件 用于数据分析和统计建模 如果您需要对cgss2017数据进行实证分析 可以使用Stata中的各种工具 如回归分析 t检验和统计图表等 在分析之前 需要先导入cgss2017数据到Stata中 然后就可以使用不同的命
  • addr2line输出问号怎么办

    前言 使用backtrace等工具将程序异常运行的堆栈打印出来 然后再结合使用addr2line将堆栈地址转为文件行 将对于定位故障非常有帮助 但有时使用addr2line却输出为 0 从addr2line的man手册中看确实没有分C和C