ART如何实现Exception.printStackTrace

Throwable源码异常分析 问题: Throwable是所有异常的父类,那么异常到底包含哪些信息呢? 1.Throwable包含哪些成员变量? public class Throwable implements Serializable { private transient volatile Object backtrace; //异常信息 private String detailMessage; //当前异常是由哪个Throwable所引起的 private Throwable c 阅读详情

大家都很熟悉Exception.printStackTrace,而且也非常的常用。不过,各位有没有想过应该如何实现呢?


想象一下,当我们调试一个C/C++程序的时候,我们也能看到函数的调用堆栈,一定会想,这究竟是怎么做到呢?因为ART运行的也是机器码,那么它们也一定有共同的地方吧。


当然,我们并不是真正的去了解一个C/C++程序是如何实现调试的,我们只是借鉴一下它的原理。

以ARM为例,我们都知道,当一个函数运行时,CPU的寄存器PC保存了当前指令的地址,而寄存器SP保存了当前的堆栈栈顶地址。当我们调用一个函数时,需要用指令BL <地址偏移> ,这个时候,CPU会将BL后面的指令地址放入寄存器LR中,然后跳转到子函数的入口。

BL 是Branch Link的缩写,LR 是Link Register的缩写。对于子函数,如果要正确返回,它必须在入口处 PUSH LR,当函数返回时,POP LR,然后再 B LR。 (更简洁的方法是 POP PC)。如果我们知道函数所使用的栈帧大小,那么我们就可以知道上个函数的调用地址了。

至于栈帧的大小,有很多方法,比如,将它们和函数的入口地址做个映射,根据函数的入口地址获取栈帧的大小,配合保存在栈固定位置的LR寄存器的值,就可以获得完整的调用栈了。


根据《ART如何传递参数》这一章节,我们知道,一个普通java函数在被转换为本地函数后,它的栈结构是这样的。

PUSH LR
.... <其他寄存器> ....
.... <内部变量/参数调用必须> ....
ArtMethod *
 

我们知道栈顶元素是ArtMethod的指针,也就是这个栈帧所代表的函数。


那么,ArtMethod能够获取栈帧的大小吗?我想是肯定的。


仔细阅读以下源代码,让我们找到看:


Android Hook攻防实战:Xposed框架应用与指纹检测对抗指南 在移动安全领域,Hook技术是理解应用运行时行为的关键技术之一,它通过拦截和修改函数调用来实现功能扩展或行为监控。其核心原理在于利用系统或应用层的注入机制,在目标方法执行前后插入自定义代码。这项技术在软件调试、热修复、自动化测试等工程实践中具有重要价值,尤其在Android生态中,它常被用于安全评估和风控策略验证。随着应用安全意识的提升,针对Hook行为的指纹检测技术应运而生,它通过识别Hook框架留下的环境特征来发现潜在风险。本文聚焦于Xposed框架这一经典工具,深入探讨如何利用其进行稳定的Java层H 阅读详情

相关推荐

使用Dobby框架动态Hook实现Android APK证书校验绕过

在Android应用安全与逆向工程领域,Hook技术是一种核心的动态代码注入手段,它允许开发者在程序运行时拦截并修改函数执行流程,从而实现行为监控、逻辑修改或安全测试。其原理是通过修改目标函数在内存中的指令,将执行流重定向到自定义代码。这项技术的核心价值在于能够在不修改原始安装包的情况下,对应用进行实时、精准的干预,极大地提升了安全分析、漏洞挖掘和兼容性修复的效率。在移动安全、自动化测试和软件调试等场景中,Hook技术应用广泛。本文聚焦于利用轻量级Hook框架Dobby,针对Android APK中常见的证

weixin_30765577的博客 349

Android ART函数抽取壳原理与实现:从Dex保护到运行时修复

在Android应用安全领域,加壳技术是保护代码逻辑的核心手段。其基本原理是通过对Dex文件进行加密或混淆,防止逆向工程直接分析关键代码。随着Android Runtime(ART)的引入,传统的整体加密方案面临兼容性挑战,促使技术向更精细化的函数级保护演进。函数抽取壳作为一种高级保护方案,通过有选择性地抽空关键方法的字节码指令,仅在运行时动态解密和填充,实现了对核心逻辑的隐蔽保护。这种技术不仅提升了应用的安全性,还能有效对抗静态分析和动态调试。在实际工程中,实现函数抽取壳需要深入理解ART虚拟机的类加载、

weixin_30613433的博客 405

Android Hook机制实战:从原理到面试,掌握系统级编程核心

在软件工程中,Hook(钩子)是一种重要的编程模式,它允许开发者在程序执行的关键节点插入自定义代码,从而在不修改源码的情况下改变或扩展原有行为。其核心原理依赖于运行时反射和动态代理技术,通过反射获取并操作私有成员,再通过动态代理拦截接口调用,实现对系统流程的监听与控制。这种技术的核心价值在于提供了强大的系统级扩展能力,是实现无侵入式监控、热修复、插件化等高级功能的底层基础。在Android开发领域,Hook机制是深入理解系统框架(如Binder通信、AMS/PMS服务、组件生命周期)的关键切入点,广泛应用于

weixin_34212762的博客 376

Exception printStackTrace()和getMessage()方法的区别

Exception printStackTrace()和getMessage()方法的区别: 首先:Exception是异常处理类,它最大的异常类,即父类,将会被子类继承。因此我们在捕捉异常时不清楚 具体是那个类出现异常,我们可以使用try/catch去捕捉,保证程序能正常运行,调用具体方法打印出捕捉结果,catch中的代码只有在出现异常时才会运行...

黎子爱发呆博客 8307

Android全链路堆栈追踪:从Java到Kernel的实战指南

堆栈追踪(Stack Trace)是软件开发中诊断异常的核心技术,通过记录函数调用链路帮助开发者快速定位问题根源。在Android系统中,由于涉及Java虚拟机、Native代码和Linux内核的多层架构,堆栈分析需要掌握跨层技术方案。Java层通过Throwable.printStackTrace()或Thread.getStackTrace()获取调用链,Native层依赖libunwind或debuggerd生成墓碑文件,Kernel层则需结合dmesg、ftrace等工具。全链路堆栈分析能有效解决音

weixin_33690963的博客 405

IEC103协议实战指南:报文解析与传输优化策略

本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。

r2s3t4的博客 541

printStackTrace()方法在exception中的理解

代码如下: public class Test { public static void main(String[] args) { int[] x = new int[10]; Random r = new Random(); try { int pos = r.nextInt(20); System.out.println(x[pos]); }catch(ArrayIndexOutOfBoundsException e) { System.out.println(“Too big”); e.printS

m0_54578792的博客 1242

CS算法实战:用MATLAB从零实现SAR点目标成像(附完整代码)

本文详细介绍了如何使用MATLAB从零实现SAR点目标CS成像算法,涵盖Chirp Scaling(CS)算法的核心理论、距离徙动校正(RCMC)和方位压缩等关键步骤。通过完整的代码示例和实战技巧,帮助读者掌握SAR成像处理算法,提升遥感图像处理能力。

weixin_29211309的博客 179

Java的printStackTrace

Java中的方法是Throwable类的一个公共方法,它用于打印异常(Exception)或错误(Error)的栈追踪信息到标准错误流(System.err当程序抛出异常或错误,并被捕获后,可以使用方法输出详细的调用栈信息,这在调试程序时非常有用,因为它可以帮助开发者确定异常发生的位置和原因。当异常发生时,JVM(Java虚拟机)会记录下抛出异常时的调用栈信息。方法会打印出这个信息,它包括了异常发生的序列,从发生异常的方法开始,一直追溯到调用栈的最顶端。下面是这里的输出表示异常的类型是,异常信息是。

weixin_63490470的博客 4793

【科学文献计量】标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)

@[TOC](标准参考出版年谱(Standard RPYS)和多维参考出版年谱(Multi RPYS)) 1 标准参考出版年谱与多维参考出版年谱 1.1 标准参考出版年谱(Standard RPYS) 标准参考出版年谱(Standard Reference Publication Year Spectroscopy)是由Marx, Bornmann, Barth, and Leydesdorff(2014)和Marx and Bornmann(2014)提出的一种量化历史出版物对研究领域影响的方法。该方法通

lys_828的博客 1103

【Bug已解决】Failed to fetch version ECONNREFUSED 解决方案

方案适用场景推荐指数难度方案一:NODE_EXTRA_CA_CERTS代理/企业网关证书⭐⭐⭐⭐⭐低方案二:浏览器导出证书不知证书在哪⭐⭐⭐⭐中方案三:使用系统证书macOS 用户⭐⭐⭐⭐中方案四:关闭代理直连快速验证⭐⭐⭐低方案五:更新 Node.js证书列表过时⭐⭐⭐低方案六:同步系统时间时间偏差导致⭐⭐⭐低根本原因。

博客 9974

java的Exception方法printStackTrace()不打印日志?

背景 记录java的Sytem.out与System.err区别 e.printStackTrace()与Sytem.err的关系 在生产环境在捕获到异常的时候调用e.printStackTrace(),然后又立即调用log.info()打印日志,可能会出现什么问题?是顺序输出日志的吗? e.printStackTrace()一定会打印日志吗? 过程 现象 测试代码 public class JsonTest { public static void main(String[] args

sanding的博客 6805

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

异常中的方法 printStackTrace();

在try里面发现问题后,jvm会帮我们生成一个异常对象,相当于new了一个对象, 然后把这个对象抛出和catch里面的类进行匹配。 如果该对象是某个类型的,就会执行该catch里面的处理信息 public class ExceptionDemo { public static void main(String[] args) { String s = “2014-11-20”; Sim...

建业的博客 4893

【Bug已解决】codex: rate limit 429 / Too many requests / RPM exceeded — CodeX CLI 速率限制解决方案

CodeX CLI 触发 429 速率限制(RPM/TPM/并发)的解决方案,含请求间隔、自动重试、便宜模型、Tier 升级与多 Key 轮换。

博客 4891

零基础吃透!Python爬虫实战:超详细爬取小红书图文,解析封面+标题+文案全流程

本文为零基础开发者提供小红书图文爬取全流程指南,针对动态加载、严格反爬等核心痛点,从环境配置到数据解析详细讲解。主要内容包括: 核心特性分析:动态加载机制需抓包获取真实接口,严格反爬依赖Cookie验证和请求头伪装 环境准备:Python 3.8-3.10环境,使用requests/beautifulsoup4等库,通过浏览器开发者工具获取有效Cookie 实战步骤: 定位关键API接口(note/list) 配置请求头(含Cookie/User-Agent/Referer) 实现分页爬取和异常处理 解析封

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 730

安卓隐藏API限制绕过实战:从反射到JNI的深度破解方案

在Android开发中,反射机制是访问和调用类、方法、字段的核心技术,它允许程序在运行时动态获取信息并执行操作。其原理是通过Java的反射API,绕过编译时的类型检查,直接与JVM交互。这项技术的价值在于实现高度灵活和动态的代码行为,尤其在框架设计、插件化开发和系统级功能扩展中不可或缺。然而,从Android 9开始,Google引入了严格的非SDK接口限制,将大量系统内部API标记为隐藏,反射调用这些API会触发ART虚拟机的策略检查并抛出异常。为了突破这一限制,开发者探索了多种高阶方案,例如通过双重反射

weixin_30458043的博客 395

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android内存管理与性能优化面试真题

概念解析:LRU算法的⼯程实现 LruCache(Least Recently Used,最近最少使⽤)是Android提供的⼀个核⼼缓存⼯具类。它的设计理念⾮常符合⼈类直觉:“如果⼀个数据最近被访问过,那么它在未来被访问的概率12 / 38极⾼;反之,如果⼀个数据很久没被碰过,当内存吃紧时,它就应该第⼀个被踢出局。” 在源码层⾯,LruCache 的底层⼼脏是⼀个 LinkedHashMap。

qq_52269550的博客 689

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android版本差异适配方案(5.0-11.0)

Android版本差异适配方案(5.0-9.0) 一个好的APP最好支持90%设备,由于不同版本系统提供的API可能不同,所以了解不同版本间系统差异很重要,这样才能更好的适配更多的智能设备。你的应用足不足够健壮要看你的应用在主流版本运行是否流畅。这篇文章记录开发过程中遇到的相对重要以及常用的适配方案,希望对读者有所帮助。 Android 版本号及对应的版本名 版本号 版本名 中文名 ...

博由心生,福泽一生 6715

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

如何用Barefoot构建实时追踪系统?Tracker Server的配置与实战案例

Barefoot是一款强大的Java地图匹配库,支持将地图集成到软件和服务中,提供先进的在线和离线地图匹配功能,可独立使用或在云端部署。本文将详细介绍如何利用Barefoot的Tracker Server组件快速搭建实时追踪系统,从环境准备到配置优化,助你轻松实现高精度的位置追踪功能。 ## 一、Barefoot实时追踪系统核心架构解析 Barefoot的Tracker Server采用分层架

gitblog_01016的博客 872

Simpleperf 使用

Simpleperf 是Google随NDK一起发布的一款profile工具(注:从NDK r13开始),它是针对Android平台的一个 native 层性能分析工具。

蛰伏--当你不够强大时,就不要放弃努力 1465

Android Studio 2021.3.1 开发 Xposed 模块:从原理到实战

动态代码插桩技术是一种在程序运行时修改其行为的高级技术,其核心原理是通过拦截和替换目标方法调用来实现功能增强或行为分析。在Android生态中,这项技术对于安全研究、应用逆向和自动化测试等领域具有重要价值。Xposed框架作为Android平台上成熟的动态插桩实现,通过Hook机制允许开发者在无需修改APK源码的情况下改变应用逻辑。随着LSPosed等现代框架的发展,基于Riru或Zygisk技术,Xposed已完美适配Android 9.0至14系统,其模块化设计提升了安全性和稳定性。在Android S

weixin_30889885的博客 335

1、Redis学习-redis-windows环境安装与测试+linux环境安装以及一些操作

目录 1、安装 2、linux 安装 3、启动 4、MAC 平台下的启动 4、报错 5、教程 6、Redis原生命令学习 7、关于 Redis 存储信息可以备份到硬件 8、免费的 Redis 可视化工具 AnotherRedisDesktopManager 9、Redis 设置客户端连接密码 9.1、在配置文件中设置,设置完毕后需要重启redis 9.2、通过命令行设置-无...

༺ bestcxx的专栏 ༻ 1915

android脱糖

`Android 5`、`Adnroid 6`系统原生只支持到`Java 7`,`Android 7`原生仅支持部分`Java 8`特性(比如Lambda表达式),到了`Android 8`则完整支持`Java 8`了。我们写Android项目时,对于兼容性,一般来说指定`minSdk`就可以了,比如`minSdk`设置为21,对应为`Android 5`,也就是说这个项目需要兼容的最低版本是`Android 5`,假设我们把`targetCompatibility`和`jvmTarget`设置为11,那生

Android菜鸟的专栏 2209

(课程设计)springboot手工艺品在线销售系统的设计与实现-计算机毕设 附源码 29217

注册用户模块 1.注册登录:用户可以通过注册和登录功能访问平台,浏览商品、下单购物、管理个人信息及订单。 2.首页:用户登录后可访问首页,查看推荐商品、通知公告、新闻资讯等内容。 3.通知公告:提供平台重要公告,展示系统运营相关的通知和活动信息。 4.新闻资讯:展示与手工艺品相关的最新新闻、行业动态和文化活动资讯。 5.艺品商城:用户可以浏览和购买不同类型的手工艺品,查看商品详情及价格。 6.商城管理:用户可以查看和管理自己的购物车、订单、收货地址等。 7.修改密码:用户可以修改账户密码,确保账户安全。

ID3461074420的博客 1548
上一篇: ART是怎么实现参数传递的?
下一篇: 你所不知道的C++ 之 令人疑惑的默认构造
漂流的代码
博客等级 码龄23年 188粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值