问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案

起因

在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是

b binder_poll
b ep_ptable_queue_proc
b remove_wait_queue

但是由于是android系统,上面三个函数会被频繁的触发,不知道哪次断下的是自己提供的进程触发的,所以准备使用条件断点,只在自己的进程触发下断下。这个条件断点的首要目标是获取aarch kernel的current

观察高版本内核gdb相关代码,目标是获取SP_EL0的值

def get_current_task(cpu):task_ptr_type = task_type.get_type().pointer()if utils.is_target_arch("x86"):var_ptr = gdb.parse_and_eval("&current_task")return per_cpu(var_ptr, cpu).dereference()elif utils.is_target_arch("aarch64"):current_task_addr = gdb.parse_and_eval("$SP_EL0")if((current_task_addr >> 63) != 0):current_task = current_task_addr.cast(task_ptr_type)return current_task.dereference()

困难

狗币google,最新的android emulator使用的qemu版本还是qemu-2.10.0,无法通过gdb获取系统寄存器的值,也就是没办法获取SP_EL0

解决-重编android emulator

重编android kernel

添加CONFIG_GDB_SCRIPTS=y配置,使gdb附加上时,lx-系列命令自动可用

编译android emulator

https://android.googlesource.com/platform/external/qemu/+/emu-master-dev/android/docs/LINUX-DEV.md
https://android.googlesource.com/platform/external/qemu/+/emu-master-dev

下载android emulator并编译

# 1、环境,以及下载源码
sudo apt-get install -y git build-essential python qemu-kvm ninja-build python-pip ccachemkdir $HOME/bin
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > $HOME/bin/repo
chmod 700 $HOME/bin/repo
export PATH=$PATH:$HOME/binmkdir -p emu-master-dev && cd emu-master-dev
repo init -u https://android.googlesource.com/platform/manifest -b emu-master-dev
repo sync -j 8
cd external/qemu# 2、配置ccache# 3、编译
python3 android/build/python/cmake.py --noqtwebengine --noshowprefixforinfo --target linux_aarch64 --ccache auto

这个时候就知道android emulator使用的版本到底有多老了qemu-img -V

修改qemu - gdbstub64

https://stackoverflow.com/questions/46415059/how-to-observe-aarch64-system-registers-in-qemu
https://lists.gnu.org/archive/html/qemu-arm/2020-05/msg00703.html
https://github.com/qemu/qemu/commit/200bf5b7ffe

这里只是做测试,把x1,x2等寄存器替换为了SP_EL0,时间够,以后再改
target/arm/gdbstub64.c


int aarch64_cpu_gdb_read_register(CPUState *cs, uint8_t *mem_buf, int n)
{ARMCPU *cpu = ARM_CPU(cs);CPUARMState *env = &cpu->env;// 这里进行测试 beginif (n == 1 || n == 2 || n ==3) {return gdb_get_reg64(mem_buf, env->sp_el[0]);}// 这里进行测试 endif (n < 31) {/* Core integer register.  */return gdb_get_reg64(mem_buf, env->xregs[n]);}switch (n) {case 31:return gdb_get_reg64(mem_buf, env->xregs[31]);case 32:return gdb_get_reg64(mem_buf, env->pc);case 33:return gdb_get_reg32(mem_buf, pstate_read(env));}/* Unknown register.  */return 0;
}

修改完毕后,继续重编android emulator

修改android-goldfish-4.4-dev gdb相关脚本

goldfish/scripts/gdb/linux/cpus.py

task_type = utils.CachedType("struct task_struct")class LxCurrentFunc(gdb.Function):"""Return current task.$lx_current([CPU]): Return the per-cpu task variable for the given CPU
number. If CPU is omitted, the CPU of the current context is used."""def __init__(self):super(LxCurrentFunc, self).__init__("lx_current")def invoke(self, cpu=-1):task_ptr_type = task_type.get_type().pointer()# 我在gdbstub64.c中将x1替换为了SP_EL0# 后期再改,这里只实验是能获取currentcurrent_task_addr = gdb.parse_and_eval("$x1")gdb.write(str(hex(current_task_addr)))if((current_task_addr >> 63) != 0):current_task = current_task_addr.cast(task_ptr_type)return current_task.dereference()

使用

下一个断点,在自己的进程运行起来之后断下,目的:通过lx-ps查看该进程的pid

pwndbg> lx-ps
0xffffffc02a8f7000 2343 AsyncTask #1
0xffffffc02a8f3800 2345 ExecutorUtils
0xffffffc02d4dd400 2367 android_tese  <<<<<<<<<<< 

下断点,测试
我在gdbstub64.c中将x1替换为了SP_EL0,后期再改,这里只实验是能获取current

b binder_poll if ((struct task_struct)(*$x1)).pid == 2367
b ep_ptable_queue_proc if ((struct task_struct)(*$x1)).pid == 2367
b remove_wait_queue if ((struct task_struct)(*$x1)).pid == 2367

在这里插入图片描述

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

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

相关文章

ERC721解读

NFT(非同质化代币):类似于明朝、宋朝的青花瓷。虽然都是青花瓷。但是都具有唯一的典藏价值。而且价值可能不同。 NFT就是具有唯一价值的代币。 ERC721: 是以太坊规定实现NFT的一种标准了。实现ERC21标准的智能合约就是NFT代币了。 1.接口 1.ERC721 定义接口参考&#xff1a;ER…

vue.js中slot插槽的作用

作为一种流行的JavaScript框架&#xff0c;vue.js提供了很多功能强大的特性&#xff0c;其中之一就是插槽&#xff08;slot&#xff09;。插槽是一种能够让父组件向子组件传递内容的机制&#xff0c;它为我们构建可复用的组件提供了更大的灵活性和可扩展性。以下介绍Vue中插槽的…

《Docker极简教程》--Docker服务管理和监控--Docker服务的监控

Docker监控的必要性在于确保容器化环境的稳定性、性能和安全性。以下是几个关键原因&#xff1a; 性能优化和故障排除&#xff1a;监控可以帮助识别容器化应用程序的性能问题&#xff0c;并快速进行故障排除。通过监控关键指标&#xff0c;如CPU利用率、内存使用、网络流量等&…

ElementUI table表格组件实现双击编辑单元格失去焦点还原,支持多单元格

在使用ElementUI table表格组件时有时需要双击单元格显示编辑状态&#xff0c;失去焦点时还原表格显示。 实现思路&#xff1a; 在数据中增加isFocus:false.控制是否显示在table中用cell-dblclick双击方法 先看效果&#xff1a; 上源码&#xff1a;在表格模板中用scope.row…

springboot集成mqtt

文章目录 前言一、MQTT是什么&#xff1f;二、继承步骤1.安装MQTT2.创建项目&#xff0c;引入依赖3. 对应步骤2的代码3 测试 总结mqtt 启动后访问地址 前言 随着物联网的火热,MQTT的应用逐渐增多 曾经也有幸使用过mqtt,今天正好总结下MQTT的使用; 一、MQTT是什么&#xff1f;…

从扩散模型基础到DIT

Diffusion model 扩散模型如何工作&#xff1f; 输入随机噪声和文本内容&#xff0c;通过多次预测并去除图片中的噪声后&#xff0c;最终生成清晰的图像。 以上左边这张图&#xff0c;刚开始是随机噪声&#xff0c;999为时间序列。 为什么不直接预测下一张图片呢&#xff1f;…

springboot+vue的宠物咖啡馆平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

《卓有成效的管理者》

前言 管理工作在很大程度上是要言传身教的&#xff0c;如果管理者不懂得如何在自己的工作中做到卓有成效&#xff0c;就会给其他人树立错误的榜样。 第 1 章 卓有成效是可以学习的 关于体力工作&#xff0c;我们已有一套完整的衡量方法和制度&#xff0c;从工程设计到质量控制…

Java中常用的类(一)

一、API应用程序编程接口&#xff1a; API&#xff1a;指的是官方给开发人员提供的一个说明文档&#xff0c;对于语言有哪些类&#xff0c;类中有哪些方法进行说明 二、Object类 Object是java中所有类的父类&#xff0c;体系结构中最顶层的类&#xff0c;位置是java.lang.Ob…

【深度学习笔记】3_4 逻辑回归之softmax-regression

3.4 softmax回归 Softmax回归&#xff08;Softmax Regression&#xff09;&#xff0c;也称为多类逻辑回归&#xff08;Multinomial Logistic Regression&#xff09;&#xff0c;是一种用于多分类问题的分类算法。虽然名字里面带回归&#xff0c;实际上是分类。 前几节介绍的…

Socks5代理与代理IP的应用

在全球化的背景下&#xff0c;跨界电商和游戏行业正经历着蓬勃发展的时代。然而&#xff0c;随之而来的网络安全挑战也日益突出。为了应对这些挑战&#xff0c;Socks5代理与代理IP等技术成为了保障网络安全的重要工具。本文将探讨这些技术在跨界电商和游戏行业中的应用&#xf…

Python模块百科_时间的访问和转换(time)_下

TOC 一、概述 time模块提供了各种与时间相关的函数。相关功能还可以参阅datetime 和 calendar模块。 尽管所有平台皆可引用此模块&#xff0c;但模块内的函数并不是所有平台都可用。此模块中定义的大多数函数的实现都是调用其所在平台的C语言库的同名函数。因为这些函数的语义…

Rust之构建命令行程序(四):用TDD(测试-驱动-开发)模式来开发库的功能

开发环境 Windows 11Rust 1.75.0 VS Code 1.86.2 项目工程 这次创建了新的工程minigrep. 用测试-驱动模式来开发库的功能 既然我们已经将逻辑提取到src/lib.rs中&#xff0c;并将参数收集和错误处理留在src/main.rs中&#xff0c;那么为代码的核心功能编写测试就容易多了。我…

C#浮点运算出错问题

在计算单价等活动的时候&#xff0c;我们经常会用到double 浮点进行运算&#xff0c;但是在乘除的时候经常出现精度丢失问题 decimal 关键字表示 128 位数据类型。 同浮点型相比&#xff0c;decimal 类型具有更高的精度和更小的范围&#xff0c;这使它适合于财务和货币计算 dou…

【MATLAB源码-第146期】基于matlab的信源编码仿真GUI,对比霍夫曼编码,算术编码和LZ编码。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 霍夫曼编码、算术编码和LZ编码是三种广泛应用于数据压缩领域的编码技术。它们各自拥有独特的设计哲学、实现方式和适用场景&#xff0c;因此在压缩效率、编解码速度和内存使用等方面表现出不同的特点。接下来详细描述这三种编…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(7)特征构造

特征分析之后&#xff0c;就是特征构造。 特征构造第一步 特征构造往往要进行数据的归一化。 在本案例中&#xff0c;我们将所有的数据&#xff0c;将所有特征区间调整为0~1之间。 如上图。 那么&#xff0c;为什么要进行归一化&#xff0c;又如何将数据&#xff0c;调整为…

信号处理与 signal.h 库

C 语言中的 signal.h 头文件提供了一种处理程序执行期间报告的不同信号的机制。它定义了一些变量类型、宏和函数&#xff0c;让程序能够更灵活地响应来自操作系统或其他进程的信号。 sig_atomic_t 类型 sig_atomic_t 类型是一种在信号处理程序中使用的整数类型。它保证在信号…

QtCreator“设计”按钮灰色无法点击,如何解决

Mac中安装QML Designer插件&#xff1a; 首选项-> 关于插件 -> 勾选QT Quick下的QML Designer 点击确定安装插件&#xff0c;重启Qt Creator后生效

【Langchain多Agent实践】一个有推销功能的旅游聊天机器人

【LangchainStreamlit】旅游聊天机器人_langchain streamlit-CSDN博客 视频讲解地址&#xff1a;【Langchain Agent】带推销功能的旅游聊天机器人_哔哩哔哩_bilibili 体验地址&#xff1a; http://101.33.225.241:8503/ github地址&#xff1a;GitHub - jerry1900/langcha…

C++惯用法之CRTP(奇异递归模板模式)

相关系列文章 C惯用法之Pimpl C之数据转换(全) 目录 1.介绍 2.CRTP的使用场景 2.1.实现静态多态 2.2.代码复用和扩展性 3.总结 1.介绍 CRTP的全称是Curiously Recurring Template Pattern&#xff0c;即奇异递归模板模式&#xff0c;简称CRTP。CRTP是一种特殊的模板技术和…