当前位置: 首页 > news >正文

问题慢慢解决-通过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

在这里插入图片描述

相关文章:

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

起因 在摸索到这个方案之后&#xff0c;mac m1调试aarch64 android kernel最终方案&#xff0c;就准备调试内核了&#xff0c;预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统&#xff0c;上面三个函数会被频繁的触发&am…...

社区发现之标签传播算法(LPA)

在Graph领域,社区发现(Community detection)是一个非常热门且广泛的话题,后面会写一个系列,该问题实际上是从子图分割的问题演变而来,在真实的社交网络中,有些用户之间连接非常紧密,有些用户之间的连接较为稀疏,连接紧密的用户群体可以看做一个社区,在风控问题中,可…...

【前端素材】推荐优质后台管理系统Dashy平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…...

MFC 配置Halcon

1.新建一个MFC 工程&#xff0c;Halcon 为64位&#xff0c;所以先将工程改为x64 > VC 目录设置包含目录和库目录 包含目录 库目录 c/c ->常规 链接器 ->常规 > 链接器输入 在窗口中添加头文件 #include "HalconCpp.h" #include "Halcon.h"…...

xss-跨站脚本攻击漏洞

前备知识&#xff1a; Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术&#xff0c;它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**&#xff1a; - Cookie是一种由服务器发送到客户端&#xff08;通常是用户的浏览器&#x…...

在MFC对话框中嵌入web网页时事件失效问题

2010-04-20 日志 在MFC对话框中嵌入web网页时&#xff0c;网页初始化中添加事件无效 document.body.onkeydown function () {//onkeydown"keydownbody()" 不能激发alert(event.keyCode);if(event.keyCode 27)//VK_ESCAPE //String.fromcharcode(A);{if (external…...

【Leetcode】235. 二叉搜索树的最近公共祖先

文章目录 题目思路代码结果 题目 题目链接 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度…...

python 基础语法及保留字

编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码&#xff1a; # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&#xff0c;对应适合语…...

Parade Series - NVR Stat

获取文件夹占用空间信息 DIR %NVRHOME% /W /SDIR %NVRHOME% /s | tail -n2 | sed s/,//g | awk {if(NR1){key"Used";}else{key"Free";};sum$3/(1024*1024);unit"MB";if(sum^>1024){sumsum/1024;unit"GB";}printf("{\"Ty…...

【shell脚本实战学习笔记】#2

场景描述 你负责一个Web应用的运维工作&#xff0c;该应用部署在一组Linux服务器上。你需要编写一个Shell脚本来自动化以下任务&#xff1a; 检查Web服务器进程&#xff1a; 确保Web服务器&#xff08;例如Apache或Nginx&#xff09;正常运行。如果没有运行&#xff0c;则尝试…...

docker 安装nacos 一脚shell脚本

要创建一个用于安装Nacos的Docker的Shell脚本&#xff0c;你可以按照以下步骤进行。这个脚本会执行以下操作&#xff1a; 拉取Nacos的Docker镜像。创建一个Docker容器并映射必要的端口。设置Nacos的环境变量。如果需要&#xff0c;可以持久化存储数据到本地目录。 以下是一个…...

mysql的隔离级别,和实现

参考链接 https://xiaolincoding.com/mysql/transaction/mvcc.html#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B 事务特性&#xff08;ACID&#xff09; 原子性&#xff08;Atomicity&#xff09;&#xff1a; 事务是原子的&…...

Linux的信号

Linux的信号是一种用于进程之间通信的机制。它们用于向进程发送通知&#xff0c;告知进程发生了某种事件或请求进程执行某个操作。信号可以由内核、其他进程或进程自身发送。 信号的作用有以下几个方面&#xff1a; 通知进程某个事件的发生&#xff0c;如进程的终止、挂起、恢…...

Spring数据脱敏实现

在当今的数字化时代&#xff0c;数据安全和个人隐私保护变得日益重要。为了遵守各种数据保护法规&#xff0c;如欧盟的GDPR&#xff08;通用数据保护条例&#xff09;&#xff0c;企业在处理敏感信息时需要格外小心。数据脱敏是一种常见的技术手段&#xff0c;用于隐藏敏感数据…...

Java核心-核心类与API(4)

话接上回&#xff0c;继续核心类与API的学习&#xff0c;最后介绍一下Object类以及与数学、日期/时间有关的类&#xff0c;就结束该部分的学习了&#xff0c;其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类…...

【C语言】详解计算机二级c语言程序题

文章目录 前言资料相关程序题 一&#xff08;字符串&#xff09;程序题 二&#xff08;数组&#xff09;程序题 三&#xff08;基础&#xff09;程序题 四&#xff08;结构体&#xff09;程序题 五&#xff08;结构体&#xff09;程序题 六&#xff08;基础&#xff09; 前言 …...

限流算法

下面对常见的限流算法进行讨论。目前&#xff0c;常用的限流算法主要有三种&#xff1a;计数器法、滑动窗口算法、漏桶算法和令牌桶算法。下面分别介绍其原理。 1. 计数器法 计数器法是通过计数对到来的请求进行选择性处理。如系统限制一秒内最多有X个请求&#xff0c;则在该…...

备战蓝桥杯 Day10(背包dp)

01背包问题 1267&#xff1a;【例9.11】01背包问题 【题目描述】 一个旅行者有一个最多能装 M&#xfffd; 公斤的背包&#xff0c;现在有 n&#xfffd; 件物品&#xff0c;它们的重量分别是W1&#xff0c;W2&#xff0c;...,Wn&#xfffd;1&#xff0c;&#xfffd;2&#…...

Sora 使用教程,新手小白可用

Sora 使用教程&#xff0c;新手小白可用 参考文章&#xff1a;Sora 使用教程&#xff0c;OpenAI 的文生视频模型 为了在激烈的行业竞争中保持领先地位&#xff0c;OpenAI 在 2024 年 2 月 15 日发布了其革命性的文本至视频转换模型——Sora。这个先进的工具能够将文本描述转化…...

【洛谷千题详解】P1031 均分纸牌

目录 题目描述 思路点拨 AC代码 题目描述 题目网址&#xff1a;[NOIP2002 提高组] 均分纸牌 - 洛谷 有 N 堆纸牌&#xff0c;编号分别为 1,2,……,N。每堆上有若干张&#xff0c;但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌&#xff0c;然后移动。 移牌规则为&a…...

从供热管道泄漏模拟出发,聊聊Fluent中那些容易被忽略的‘粘性模型’选择细节

从供热管道泄漏模拟看Fluent粘性模型选择的工程智慧 供热管道泄漏事故的数值模拟一直是市政工程中的难点——当高温高压流体从破损处喷涌而出时&#xff0c;流动形态会经历从管道内湍流到自由射流的复杂转变。这种多尺度流动对湍流模型的选择提出了严苛考验&#xff0c;而大多数…...

Qwen3-Reranker-8B企业落地:保险条款智能比对系统重排模块部署

Qwen3-Reranker-8B企业落地&#xff1a;保险条款智能比对系统重排模块部署 1. 项目背景与需求场景 保险行业每天需要处理大量的条款文档比对工作&#xff0c;比如新老条款对比、不同产品条款差异分析、合规性检查等。传统的人工比对方式效率低下&#xff0c;容易出错&#xf…...

小波分解选型指南:如何为你的数据选择最合适的pywt小波函数(db4/haar/symlets对比)

小波分解选型指南&#xff1a;如何为你的数据选择最合适的pywt小波函数&#xff08;db4/haar/symlets对比&#xff09; 在信号处理领域&#xff0c;小波分解就像一把瑞士军刀&#xff0c;能够同时提供时域和频域的信息。但面对pywt库中琳琅满目的小波函数——从经典的Haar到复杂…...

Z-Image i2L模型压缩技术:轻量化部署实践指南

Z-Image i2L模型压缩技术&#xff1a;轻量化部署实践指南 1. 引言 当你兴奋地部署了一个强大的图像生成模型&#xff0c;却发现设备内存告急、推理速度慢如蜗牛&#xff0c;这种体验确实让人沮丧。Z-Image i2L作为一款创新的图像到LoRA模型&#xff0c;虽然功能强大&#xff…...

嵌入式C++ RAII互斥锁封装器MutexLocker详解

1. MutexLocker&#xff1a;嵌入式C RAII风格互斥锁封装器深度解析1.1 设计动机与工程价值在基于mbed RTOS&#xff08;现为Mbed OS中CMSIS-RTOS v2兼容层&#xff09;的嵌入式实时系统开发中&#xff0c;互斥量&#xff08;Mutex&#xff09;是保障多任务共享资源安全访问的核…...

OpenClaw+GLM-4.7-Flash:24小时运行的智能监控助手

OpenClawGLM-4.7-Flash&#xff1a;24小时运行的智能监控助手 1. 为什么需要智能监控助手&#xff1f; 去年我负责维护一个内部文档站点时&#xff0c;经常遇到半夜服务崩溃却无人知晓的情况。直到第二天同事反馈"页面打不开"&#xff0c;我才手忙脚乱地查日志、重…...

3类被90%开发者忽略的农田图像噪声——基于ISO 17202-2标准的Python去噪实战手册

第一章&#xff1a;农田图像噪声的认知革命与ISO 17202-2标准全景解读传统农业视觉系统长期将图像噪声视为需“压制”的干扰项&#xff0c;而ISO 17202-2:2023《农业遥感图像质量评估—第2部分&#xff1a;噪声建模与语义敏感性分级》首次确立噪声作为农田场景的**可解释性特征…...

3大创新突破让千元机械臂媲美工业级性能:Faze4开源六轴机器人DIY全指南

3大创新突破让千元机械臂媲美工业级性能&#xff1a;Faze4开源六轴机器人DIY全指南 【免费下载链接】Faze4-Robotic-arm All files for 6 axis robot arm with cycloidal gearboxes . 项目地址: https://gitcode.com/gh_mirrors/fa/Faze4-Robotic-arm 价值定位&#xff…...

OpenClaw轻量化方案实测:nanobot镜像性能与成本对比

OpenClaw轻量化方案实测&#xff1a;nanobot镜像性能与成本对比 1. 为什么选择nanobot镜像 上个月我在尝试用OpenClaw搭建个人自动化助手时&#xff0c;遇到了一个典型的技术选择困境&#xff1a;是直接调用云端大模型API&#xff0c;还是部署本地模型&#xff1f;经过反复权…...

手把手教你用LVGL特殊符号打造炫酷UI界面

手把手教你用LVGL特殊符号打造炫酷UI界面 在嵌入式设备开发中&#xff0c;UI设计往往面临资源受限的挑战。LVGL&#xff08;Light and Versatile Graphics Library&#xff09;作为一款轻量级开源图形库&#xff0c;通过其丰富的特殊符号系统&#xff0c;让开发者能够在有限资…...