首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过ASM在字节码中添加try/catch块时获取VerifyError

通过ASM在字节码中添加try/catch块时,可能会遇到VerifyError。VerifyError是Java虚拟机在验证字节码时发生的错误,表示字节码不符合Java虚拟机规范。

在使用ASM库进行字节码操作时,如果在字节码中添加了try/catch块,需要注意以下几点来避免VerifyError的发生:

  1. 确保try/catch块的异常类型与实际抛出的异常类型匹配。如果异常类型不匹配,会导致VerifyError。可以使用ASM提供的Type.getType()方法获取异常类型的描述符。
  2. 确保try/catch块中的异常处理逻辑正确。如果异常处理逻辑有误,也会导致VerifyError。可以使用ASM提供的MethodVisitor.visitTryCatchBlock()方法来添加try/catch块。
  3. 确保try/catch块内部的字节码指令正确。如果字节码指令有误,也会导致VerifyError。可以使用ASM提供的MethodVisitor.visitFrame()方法来生成正确的字节码指令。

总结起来,通过ASM在字节码中添加try/catch块时,需要确保异常类型匹配、异常处理逻辑正确、字节码指令正确,以避免VerifyError的发生。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云原生应用引擎(Cloud Native Application Engine,CNAE):提供全托管的云原生应用引擎,支持快速构建、部署和管理容器化应用。详情请参考:https://cloud.tencent.com/product/cnae
  • 腾讯云云服务器(Cloud Virtual Machine,CVM):提供弹性计算能力,支持按需创建、管理和扩展虚拟机实例。详情请参考:https://cloud.tencent.com/product/cvm
  • 腾讯云数据库(TencentDB):提供多种数据库产品,包括关系型数据库、NoSQL数据库和数据仓库等,满足不同场景的数据存储需求。详情请参考:https://cloud.tencent.com/product/cdb
  • 腾讯云安全产品:腾讯云提供多种安全产品,包括Web应用防火墙(WAF)、DDoS防护、安全加密等,保障云计算环境的安全性。详情请参考:https://cloud.tencent.com/solution/security
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ASM字节编程 | 用字节增强技术给所有方法加上TryCatch捕获异常并输出!

本文主要讲解关于 ASM 方式的字节增强,接下来的案例会逐步讲解一个给方法添加 TryCatch ,用于采集异常信息以及正常的出参结果的流程。 「一步步向你展示通过指令来改写你的方法!」...这部分原本需要使用 JavaAgent 技术,工程启动加载时候进行修改字节。这里为了将关于字节核心内容展示出来,通过加载类名称获取字节进行修改。...接下来我会一步步的带着你通过字节增强的方式,来实现我们的监控需求。最终的完整的代码,可以通过关注「公众号」:bugstack虫洞栈 回复源码获取(ASM字节编程)。 1....还有就是一些 Try 的开始。 visitMaxs 这个是方法结束前,用于添加 Catch 。到这也就可以将整个方法进行包裹起来了。...加入 TryCatch 开始部分在 ASM 中固定的模式,按照需求添加即可。

79110

ASM字节编程 | 用字节增强技术给所有方法加上TryCatch捕获异常并输出

本文主要讲解关于 ASM 方式的字节增强,接下来的案例会逐步讲解一个给方法添加 TryCatch ,用于采集异常信息以及正常的出参结果的流程。 一步步向你展示通过指令来改写你的方法!...这部分原本需要使用 JavaAgent 技术,工程启动加载时候进行修改字节。这里为了将关于字节核心内容展示出来,通过加载类名称获取字节进行修改。...接下来我会一步步的带着你通过字节增强的方式,来实现我们的监控需求。最终的完整的代码,可以通过关注公众号:bugstack虫洞栈 回复源码获取(ASM字节编程)。 1....还有就是一些 Try 的开始。 visitMaxs 这个是方法结束前,用于添加 Catch 。到这也就可以将整个方法进行包裹起来了。...加入 TryCatch 开始部分在 ASM 中固定的模式,按照需求添加即可。

1.4K40
  • 通过Java程序提交通用Mapreduce任务并获取Job信息

    用户的jar包和我们平台程序一个java程序是否会有冲突或其他问题? 执行提交后如何获取到JobID?...这里可以通过修改Job类的字节,去动态的注入一个这样的属性currentJob和赋值的操作。...Job类hadoop框架的jar包内,要想拦截到Job类的字节并在类加载的时候对其修改,hadoop的依赖也就须要一个ClassLoader来加载,并在其加载的loadClass方法中去获取并修改Job...类加载器有个规则:A类如果引用了B类,则加载B类的时候会通过A类的类加载器来加载,那么MR类加载器加载MR的主类,其引用到的所有类也都会通过MR类加载器来加载。...e) { } } } } } ASM 通过ASM来实现对Job类的字节的修改,ASM的使用可以参考文档:asm4-guide

    2.4K60

    手把手教你实现一个方法耗时统计的 java agent

    类加载的字节被修改后,除非再次被 retransform,否则不会恢复。 通过上面的描述,可知 可以通过Transformer修改类 类加载,会被触发 Transformer 拦截 2....实现 我们需要统计方法耗时,所以想到的就是方法的执行前,记录一个时间,执行完之后统计一下时间差,即为耗时 直接修改字节有点麻烦,因此我们借助神器javaassist来修改字节 实现自定义的ClassFileTransformer...指出了 run 方法这里,存在字节的错误,我们统计耗时的 Agent,主要就是方法开始前和结束后各自新增了一行代码,我们直接补充 run 方法,则相当于下面的代码 ?...来修改字节,为每个方法的第一行和最后一行注入耗时统计的代码,从而实现方法耗时统计 最后留一个小问题,上面的实现,当方法内部抛出异常,我们注入的最后一行统计耗时会不会如期输出,如果不会,应该怎么修改...,欢迎各位大佬留言指出解决方案 (具体解决方案可以源码获取哦,还有配套的测试 case,求支持,求赞,求关注 ❀)

    1.1K30

    字节角度—— 看synchronized和反射的实现原理

    try-catch 的代码,为什么字节会帮忙加上这段逻辑呢?...为了保证这一点,编译器会自动生成一个异常处理器,这个异常处理器的目的就是为了同步代码抛出异常能执行 monitorexit。...根据我们之前介绍的 try-catch-finally 的字节实现原理,复制 finally 语句到所有可能函数退出的地方,上面的代码等价于 public void _foo() throws...如果是,执行线程会先尝试获取锁。如果是实例方法,JVM 会尝试获取实例对象的锁,如果是类方法,JVM 会尝试获取类锁。同步方法完成以后,不管是正常返回还是异常返回,都会释放锁....小结 这篇文章主要从字节角度看了Java的synchronized和射调用底层的原理,当然还有一些其他比较有意思的语法比如lambda, switch等, 感兴趣的小伙伴也可以从字节角度去了解一下

    15220

    ASM初探

    在对象模型下的 ASM 有 两类操作纬度,分别如下所示: 1)、获取节点:获取指定类、字段、方法节点。 2)、操控操作(针对方法节点):获取操作码位置、替换、删除、插入操作、输出字节。...,我们获取了 “BIPUSH 16” 字节的位置后,便将封装它的操作替换为一个新的 VarInsnNode 操作,这个新操作封装了 “ALOAD 1” 字节, 将原程序 将值设为16 替换为...ClassReader accpet ClassVisitor开始解析字节,并将保存在内存的结果源源不断地通过调用各种 visitxxx 方法传入到 ClassVisitor 之中。...使用 ASM 进行插桩的时候,我们尤其需要注意以下 两点: 1)、当我们使用 ASM 处理字节,需要 逐步小量的修改、验证,切记不要编写大量的字节并希望它们能够立即通过验证并且可以马上执行。...2)、注意本地变量表和操作数栈的数据交换以及 try catch blcok 的处理,关于异常处理可以使用 ASM 提供的 CheckClassAdapter,可以修改完成后验证一下字节是否正常。

    1.4K10

    Agent内存马的自动分析与查杀

    对于冰蝎来讲,根本无法获取被冰蝎修改后的字节。...通过Javaassist等ASM工具获取到类的字节,也只是读取磁盘上响应类的字节,而不是JVM字节字节安全的师傅找到了一种检测手段:sa-jdi.jar 借用公众号师傅的图片,这是一个GUI...区别在于这里获取到的是真正的当前的字节,而不是获取到原始的,本地的字节,所以是可以查看被Java Agent调用redefineClass后被修改的类的字节。...,接下来我会逐个介绍 SA-JDI分析 我尝试通过Java Agent技术来获取当前的字节,发现如师傅所说拿不到被修改的字节 所以为了可以检测Agent马需要从sa-jdi.jar本身入手,想办法dump...稍微分析了下,发现是ApplicationFilterChain类包含了LAMBDA 不止这个类,不少的类都有可能会包含LAMBDA 发现通过sa-jdi获取字节存在LAMBDA的情况下是非法字节

    1.7K20

    不一样的视角来学习Spring源码之AOP---上

    ajc 编译器在编译 class 类文件,就把通知的增强功能,织入到目标类的字节 第二种是通过 agent 加载目标类,修改目标类的字节,织入增强功能 作为对比,之前学习的代理是运行时生成新的字节...---- 收获 类加载可以通过 agent 修改 class 实现增强 java文件是先被编译成class二进制字节文件,再加载进虚拟机的,Aspectj是没加载前,直接修改生成的class文件完成...方法通过getProxyClass0方法生成代理类的字节 Class cl = getProxyClass0(loader, intfs); 该方法底层通过asm字节框架生成代理类的字节后,再通过传入的类加载器加载代理类进jvm ---- arthas反编译查看生成的代理类源码...模拟生成代理类字节 因为使用asm框架的要求比较高,需要使用者熟悉jvm指令集,因此我们先手写一个代理类模板,然后通过asm插件,翻译出该类对应的asm代码: 1.安装asm插件 2.准备代理类

    40920

    终极Java反序列化Payload缩小技术

    针对TemplatesImpl_bytecodes字节的缩小 对于执行的代码如何缩小(STATIC代码) 接下来我将展示如何一步一步地缩小 最终效果能够将YSOSERIAL生成的Payload缩小接近三分之二...().exec("calc.exe"); } catch (Exception ignored) { } } } 编译不通过不代表非法,通过手段直接构造对应的字节...,我认为已经做到的接近极致,很难做到更小的 对于STATIC代码需要执行的代码也有缩小手段,这也是更有实战意义是思考,因为实战不是弹个计算器这么简单 因此可以用追加的方式发送多个请求往指定文件写入字节...,将真正需要执行的字节分块 使用Javassist动态生成写入每一分的Payload,以追加的方式将所有字节的Base64写入某文件 static { try { String...(Exception ignore) { } } 最后一个包中将字节进行Base64Decode并写入class文件 (也可以直接写字节二进制数据,不过个人认为Base64好分割处理一些

    51410

    字节插桩】AOP 技术 ( “字节插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )

    , 如果每个页面逐个手动添加 , 可能存在遗漏 , 并且会造成代码冗余 ; 通过 AOP 面向切面编程 , 完成上述操作 ; " 字节插桩 " 技术应用 : 代码生成 : 编译生成代码 , 提高开发效率..., 减少手工工作量 , 降低出错概率 ; 代码修改 : 为某些三方库添加崩溃 try catch 异常捕获机制 ; 代码监控 : 编译插桩 , 监控应用各种性能 , 如页面打开时间 , 页面停留时间...; 友盟应该用了该技术 ; 代码分析 : 使用编译字节插桩技术 , 自定义代码检查 ; 字节插桩原理 : 使用 javac 编译出 .class 字节文件之后 , 使用 ASM 或 AspectJ..., 会添加一些额外冗余代码 , 生成的字节肯定大于之前的字节文件 , 对原来的性能也有一定影响 , 修改后的字节文件 性能低于 修改前的字节文件 ; 三、ASM 插桩工具 ASM 插桩工具 :...操作灵活 : 可以字节 任何位置 , 自定义修改 , 插入 , 删除 相关逻辑 ; 上手很难 : 使用 ASM 的前提是必须 对 Java 的 .class 字节文件有比较深入的了解 ;

    1.8K20

    如何实现IDEA 的 debug?

    动态生成字节 我们知道,我们编写的 Java 代码都是要被编译成字节后才能放到 JVM 里执行的,而字节一旦被加载到虚拟机,就可以被解释执行。...虽然我对 JVM 的字节语法不熟,但有大神开发了可以 IDEA 里查看字节的插件:ASM Bytecode Outline ,在要查看的类文件里右键选择 Show bytecode Outline...对照着示例,我们就可以很轻松地写出操作字节的 Java 代码了。 而切到 ASMified 标签栏,我们甚至可以直接获取ASM 的使用代码。...常用方法 ASM 的代码实现里,最明显的就是访问者模式,ASM 将对代码的读取和操作都包装成一个访问者,解析 JVM 加载到的字节时调用。...ClassReader 是 ASM 代码的入口,通过它解析二进制字节,实例化时它,我们需要传入一个 ClassVisitor,在这个 Visitor 里,我们可以实现 visitMethod()/visitAnnotation

    31820

    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)「建议收藏」

    JVM虚拟机读取字节文件,取出二进制数据,加载到内存,解析.class 文件内的信息,生成对应的 Class对象: class字节文件是根据JVM虚拟机规范规定的字节组织规则生成的...class 对象的能力,下面看一下代码如何生成class文件的字节。...Java字节生成开源框架介绍–ASMASM 是一个 Java 字节操控框架。它能够以二进制形式修改已有类或者动态生成类。...不过ASM创建class字节的过程,操纵的级别是底层JVM的汇编指令级别,这要求ASM使用者要对class组织结构和JVM汇编指令有一定的了解。...根据需要实现的接口信息,代码动态创建 该Proxy类的字节; 4 . 将对应的字节转换为对应的class 对象; 5.

    59921

    IDEA 的 debug 怎么实现?出于这个好奇心,我越挖越深!

    动态生成字节 我们知道,我们编写的 Java 代码都是要被编译成字节后才能放到 JVM 里执行的,而字节一旦被加载到虚拟机,就可以被解释执行。...虽然我对 JVM 的字节语法不熟,但有大神开发了可以 IDEA 里查看字节的插件:ASM Bytecode Outline ,在要查看的类文件里右键选择 Show bytecode Outline...对照着示例,我们就可以很轻松地写出操作字节的 Java 代码了。 而切到 ASMified 标签栏,我们甚至可以直接获取ASM 的使用代码。...图片 常用方法 ASM 的代码实现里,最明显的就是访问者模式,ASM 将对代码的读取和操作都包装成一个访问者,解析 JVM 加载到的字节时调用。...ClassReader 是 ASM 代码的入口,通过它解析二进制字节,实例化时它,我们需要传入一个 ClassVisitor,在这个 Visitor 里,我们可以实现 visitMethod()/visitAnnotation

    41130

    Java 动态字节技术

    动态生成字节 我们知道,我们编写的 Java 代码都是要被编译成字节后才能放到 JVM 里执行的,而字节一旦被加载到虚拟机,就可以被解释执行。...对照着示例,我们就可以很轻松地写出操作字节的 Java 代码了。 而切到 ASMified 标签栏,我们甚至可以直接获取ASM 的使用代码。 ?...常用方法 ASM 的代码实现里,最明显的就是访问者模式,ASM 将对代码的读取和操作都包装成一个访问者,解析 JVM 加载到的字节时调用。...ClassReader 是 ASM 代码的入口,通过它解析二进制字节,实例化时它,我们需要传入一个 ClassVisitor,在这个 Visitor 里,我们可以实现 visitMethod()/visitAnnotation...代码实现 ---- 我测试写了一个用以上技术实现了一个简单的字节动态修改的 Demo。

    2K20

    调研字节插桩技术,用于系统监控设计和实现

    其实说的就是加了这个注解,它的信息会被带到JVM运行时,当你调用方法可以通过反射拿到注解信息。...最后 doRouter 方法体获取把方法执行 jp.proceed(); 使用 try finally 包装起来,并打印相关的监控信息。...通过 Javassist 的操作,主要是实现一个 ClassFileTransformer 接口的 transform 方法,在这个方法获取字节并进行相应的处理。...处理过程包括:获取类、获取方法、获取入参信息、获取出参信息、给方法生成唯一ID、之后开始进行方法的前后增强操作,这个增强也就是方法添加监控代码。...一些全链路监控的组件 Javassist 的使用非常多,它即可使用编码的方式操作字节增强,也可以像 ASM 那样进行处理。

    1.1K40

    IDEA 的 debug 怎么实现?出于这个好奇心,我越挖越深!

    动态生成字节 我们知道,我们编写的 Java 代码都是要被编译成字节后才能放到 JVM 里执行的,而字节一旦被加载到虚拟机,就可以被解释执行。...对照着示例,我们就可以很轻松地写出操作字节的 Java 代码了。 而切到 ASMified 标签栏,我们甚至可以直接获取ASM 的使用代码。 ?...常用方法 ASM 的代码实现里,最明显的就是访问者模式,ASM 将对代码的读取和操作都包装成一个访问者,解析 JVM 加载到的字节时调用。...ClassReader 是 ASM 代码的入口,通过它解析二进制字节,实例化时它,我们需要传入一个 ClassVisitor,在这个 Visitor 里,我们可以实现 visitMethod()/visitAnnotation...代码实现 ---- 我测试写了一个用以上技术实现了一个简单的字节动态修改的 Demo。

    56520

    使用ASM实现简单的AOP

    字节前后插入我们的代码) 字节与指令 由于ASM操作比较底层,所以我们进行字节增强的时候需要了解字节与相关指令。...使用AdviceAdapter植入增强代码 如前所述,ASM提供了AdviceAdapter工具类用于method字节插入增强代码,onMethodEnter、onMethodExit、visitMaxs...我们看下visitMaxs如何将method’s bytecode包括try-catch block。...(beginLabel, endLabel, THROWABLE_TYPE)这个语句相当于说,beginLabel和endLabel之间使用try catch block,并且catch的类型为THROWABLE_TYPE...由于java没有异常处理语句,字节执行过程异常的跳转完全靠异常表完成,那么这句话的意思也可以理解为向异常表添加一种异常 handler,该handler的起始部分为beginLabel ~ endLabel

    1.6K30

    妖怪般的VerifyError | 奇形怪状的bug

    java.lang.VerifyError 是说 JVM 加载一个类,会去校验类的正确性,只有类文件不合法才会报这个Error,这个异常发生在类的加载过程。 这个问题发生在类的生命周期的过程。...所以导致了这部分是一个异常的字节。 因为这部分我司做了一部分字节的父类替换,所以DialogFragment其实已经被修改了一部分了。...而在新版本的androidx,则给Fragment添加了另外一个有参的构造函数,所以这部分就出现了异常。...一个不需要用jadx反编译整个apk就可以快速查看class字节的方式。 通过这部分就可以快速的查看这部分异常了,方式就和下面我所截图的一样了。...检验方法getCaughtExceptionType() 找不到catch代码中指定的异常类(如例子的ErrnoException)即会报错:”VFY: unable to resolve exception

    1K40
    领券