通过反汇编解析crash问题

news2024/9/20 20:32:52

背景:

用户反馈的问题,有时候我们拿到log,发现有crash问题,有堆栈打印,能看到具体出错的函数,但是无法定位具体出错的行数和内容,这个时候就需要用到反汇编辅助我们定位问题。

反汇编方法:

通过objdump反汇编so:

objdump -d ~/shared/libxxx.so > ~/aaa.s

这样反汇编的内容就会保存到aaa.s文件中

demo查看crash问题:

首先从上面的log可以看出,程序crash的原因为signal 11 也就是空指针问题,具体出错的地址是: 0x00000000000000b8, 也就是这个地址里面存放的是空。从backtrace可以看到,出错的函数是TeaInsideSdk::Engine::OnRecvMessage,在这个函数里面,调用的下一步的函数入口是出错的地址: 0x00000000000000b8。也就是说,出错的地址是一个指针,指向了一个函数。

然后我们就可以从反汇编的文件继续查看,其中出错前执行的是00000000000b2810,所以直接从此处查看反汇编。

对应的反汇编就是这段代码。

从上面的反汇编代码可以看出,首先是调用了ParseDeviceControlResponseParams函数,然后调用了notify,然后做了一系列处理,最终出错。此时需要看c++代码,定位位置:

通过TeaInsideSdk::Engine::OnRecvMessage和ParseDeviceControlResponseParams关键信息可以定位对应代码如下:

上面的信息汇总来看,x1就是delegate_,x4就是delegate_的虚函数地址,x5就是delegate_->OnDeviceControlResult函数的入口地址。

所以,出错的原因就是OnDeviceControlResult这个函数调用失败。

查看delegate_对应的类,发现我们有新加一个虚函数,所以定位问题可能是客户拿到我们的sdk后,替换了so,但是未替换头文件导致。因为so中保存的虚函数表和头文件中不一致,所以运行出错。客户更新头文件后运行成功。

知识课堂:

crash log中的信息说明:

fault addr: (错误地址)是指在发生段错误(Segmentation Fault,信号为 SIGSEGV)时,程序试图访问的内存地址。在这个例子中

pc列表示导致段错误(SIGSEGV)的指令所在的地址。每一行对应一个栈帧(stack frame),表示调用链中的一个函数调用。栈帧从底部到顶部表示调用顺序,即底部的函数先被调用,顶部的函数后被调用

x0 至 x28:这些是ARM64架构的通用寄存器,用于存储临时数据和函数参数。

lr(链接寄存器):在函数调用过程中,这个寄存器保存了返回地址,即函数执行完毕后要跳转到的地址。在这个例子中,它的值为:0000007613cc4814。

sp(栈指针寄存器):这个寄存器指向当前栈顶的位置。在这个例子中,它的值为:000000760b41dac0。

pc(程序计数器):这个寄存器存储了当前正在执行的指令的地址。在这个例子中,它的值为:00000000000000b8。

pst(程序状态寄存器):这个寄存器包含了处理器的状态信息,如条件标志、中断使能等。在这个例子中,它的值为:0000000080001000。

汇编指令说明:

MOV - 将数据从一个位置复制到另一个位置。
JMP - 无条件跳转到指定的地址
LDR - Load Register,用于将内存中的数据加载到寄存器中
CBZ - Compare and Branch on Zero,如果寄存器的值为零,则跳转到指定的地址。
BL - Branch with Link,用于跳转到指定的地址,并将当前指令的地址保存到链接寄存器(LR)中,以便在返回时使用。
BLR - Branch with Link and Return,这是一个特殊的BL指令,用于跳转到链接寄存器(LR)中存储的地址,并从该地址处的函数返回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一起学习LeetCode热题100道(43/100)

43.验证二叉搜索树(学习) 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。…

spring bean的循环依赖

在Spring框架中,Bean的循环依赖是一个常见的问题,它指的是两个或多个Bean之间通过构造函数、Setter方法或字段注入等方式形成了相互依赖的闭环。Spring框架提供了强大的依赖注入功能,同时也提供了多种机制来处理循环依赖的情况,确…

【SCI论文写作】工程类论文写作(二)引言

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

护眼灯对眼睛有伤害吗?防止三大禁忌隐患

护眼灯对眼睛有伤害吗?护眼灯是现代生活中非常常见的照明工具,它在家庭和办公场所都得到了广泛应用。然而,随着人们对眼睛健康的关注日益增加,关于护眼灯是否可能对眼睛造成伤害的疑问也随之产生。这些疑问不仅涉及到人们的视力健…

黄晓娟:钱输光了她还伺候你?赵本山:她不伺候谁伺候?

黄晓娟:钱输光了她还伺候你?赵本山:她不伺候谁伺候? --小品《麻将豆腐》(中1)的台词与解说 (接上) 赵本山(饰演大姐夫):诈和了 瞅好啊整不好让…

工作任务紧急程度如何快速区分?

在繁忙的工作中,我们每天都需要处理大量的工作任务。如果不将这些任务仔细区分,就很难保证按时完成所有任务。面对如此多的任务,仅凭脑力很难将它们一一整理和区分。这时,选择一款高效的待办事项管理软件,就成了一个不…

深度学习入门-01

1、安装Anaconda 创建一个虚拟环境,在Anaconda Prompt中创建,环境名称叫做pytorch,使用的python版本是3.10 conda create -n pytorch python3.10在这环境中需要安装的包,选择yes 激活环境: conda activate pytorch如…

排序算法之--插入排序

文章目录 一、简介二、算法思路分析三、算法复杂度分析:3.1、时间复杂度方面:3.2、空间复杂度方面: 四、代码实现: 一、简介 插入排序是一种简单直观的排序算法,‌它的工作原理是通过构建有序序列,‌该算法…

MySQL:查询(万字超详细版)

💎所属专栏: MySQL 💎1. 单表查询 💎1.1 全列查询和指定列查询 全列查询: select * from exam; 在实际开发中不要使用 * 来进行查询,因为数据库会很大,影响效率 指定列查询: se…

低代码开发平台通过钉钉API实现流程管理数据对接

实例背景: CRM项目虽然实现了报价转订单的功能,但是客户还是遇到使用不方便的问题,客户的业务流程中,审核报价的时候是需要提供销售人员与客户的聊天记录截图,这都是在手机上的,电脑操作不方便&#xff0c…

WEB渗透免杀篇-MSF+shellcode免杀

nps_payload >python nps_payload.py正常生成 >msfconsole -r msbuild_nps.rc开启监听 >%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe xx.xml >wmiexec.py <USER>:<PASS><RHOST> cmd.exe /c start %windir%\Microsoft.NET\Framewo…

Python之字符串的函数和方法

字符串的函数和方法 字符串函数字符串方法方法链可选参数方法的嵌套 函数可以看做是执行特定任务的小程序。程序被打包或封装起来&#xff0c;提供给用户使用。**函数可以接受输人值&#xff0c;通过执行语句和判定表达式来完成任务&#xff0c;在完成时可能会返回值。**函数非…

基于STM32开发的智能家居温控系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 家庭智能温控办公室环境监测常见问题及解决方案 常见问题解决方案结论 1. 引言 智能家居温控系统通过整合温度传感器、湿度传感器、风扇和加热器等硬件&#xf…

SQL进阶技巧:断点缝合问题【如何按照业务规则对相邻行数据进行合并】

目录 0 需求描述 1 数据准备 2 数据分析 3 小结 0 需求描述 如下图所示,按照定义的规则进行数据变换 注意:b中的数值只有0和1 1 数据准备 with data as( select 2010 a,0 b union all select 2011 a,1 b union all select 2012 a,0 b union all select 2013 a,1 b un…

吴恩达机器学习-C2W1L3-简单神经网络

在本实验中&#xff0c;我们将使用Numpy构建一个小型神经网络。它将是你在Tensorflow中实现的相同的“咖啡烘焙”网络。 import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyle) import tensorflow as tf from lab_utils_common import…

ACL主席:ACL不是AI会议

敲响警钟还是走向封闭&#xff1f; 点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com 「ACL 不是 AI 会议&#xff08;ACL is not an Al conference&#xff09;」&#xff0c;在泰国曼谷举办的 ACL 2024 上&#xff0c;今年的 ACL 主席 Emily M. Bender 抛出…

实训日记day29

MySQL读写分离 1、读写分离的目的 数据库负载均衡&#xff1a; 当数据库请求增多时&#xff0c;单例数据库不能够满足业务 需求。需要进行数据库实例的扩容。多台数据库同时相 应请求。也就是说需要对数据库的请求&#xff0c;进行负载均衡 但是由于数据库服务特殊原因&#…

读零信任网络:在不可信网络中构建安全系统20攻击者视图

1. 攻击者视图 1.1. IETF要求所有提交的RFC都必须包含“安全风险考虑" 1.1.1. 明确指出了潜在陷阱、危险和警告&#xff0c;这对系统的实现和部署至关重要&#xff0c;有助于运营者确保最终的系统不会偏离设计之初的安全特性 1.1.2. 表明系统设计者对于可能存在的攻击进…

leetcode387. 字符串中的第一个唯一字符,哈希表

leetcode387. 字符串中的第一个唯一字符 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入: s “leetcode” 输出: 0 示例 2: 输入: s “loveleetcode” 输出: 2 示例…

可能是全网最好用的 5 款免费数据恢复软件

不小心将 USB 中的文件删除了&#xff0c;这个时候要怎么办&#xff1f;首先我们不要保存 USB 磁盘上的任何新数据&#xff0c;否则丢失的数据文件将被覆盖。然后再利用专业的数据恢复工具进行恢复&#xff0c;这里为大家整理了全网最被推荐的5款免费的数据恢复软件。 1.福昕数…