Jvm computeFrames选项不支持在JSR/RET失败的方法代码中添加trycatch
我正在编写一个Java代理,它应该是附加的 到正在运行的JVM。在那个正在运行的JVM上,已经加载了一个类,并且代理希望插入该类的方法 代理使用ASM框架在要插入指令的方法内容中添加Jvm computeFrames选项不支持在JSR/RET失败的方法代码中添加trycatch,jvm,java-bytecode-asm,Jvm,Java Bytecode Asm,我正在编写一个Java代理,它应该是附加的 到正在运行的JVM。在那个正在运行的JVM上,已经加载了一个类,并且代理希望插入该类的方法 代理使用ASM框架在要插入指令的方法内容中添加try/catch块 下面是我为添加try/catch块而编写的代码: public void visitCode() { if (mMethodName.equals("test")) { mv.visitLabel(startFinally); super.visit
try
/catch
块
下面是我为添加try
/catch
块而编写的代码:
public void visitCode() {
if (mMethodName.equals("test")) {
mv.visitLabel(startFinally);
super.visitCode();
}
}
public void visitMaxs(int maxStack, int maxLocals) {
Label endFinally = new Label();
mv.visitTryCatchBlock(startFinally,endFinally,endFinally,
"java/lang/Exception");
mv.visitLabel(endFinally);
mv.visitVarInsn(ASTORE, 1);
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception",
"printStackTrace", "()V"););
}
我正在ClassWriter
中使用ClassWriter.COMPUTE\u FRAMES
,但我得到一个错误:
java.lang.RuntimeException: JSR/RET are not supported with computeFrames option
at com.bea.objectweb.asm.Frame.a(Unknown Source)
at com.bea.objectweb.asm.MethodWriter.visitJumpInsn(Unknown Source)
at com.bea.objectweb.asm.ClassReader.a(Unknown Source)
我很难理解这里方法出口点的相关性。因为只有一个方法入口点,所以在唯一的
onMethodEnter()
调用中只添加了一个try
块。为什么要添加多个catch
块?这些catch
块如何与方法exit而不是try
块关联?我只想添加一个catch块,但我想添加到方法代码的末尾。当调用onMEthodExit(int操作码)时,我正在执行的catch块。现在这个onMethodExit()将被多次调用,我不知道该调用是最后一次调用。所以我的OnMeOxDebug()的实现在返回的时候在方法中间添加了catch块,所以为什么不使用<代码> VisualTead()<代码>?这样做,它现在正在工作。看来你没有抓住要点。如果类版本为49
,则可以省略COMPUTE\u FRAMES
,因为不需要计算它们。这些框架是版本50
的新功能。旧版本不知道它们,因此不需要它们。您只需注意保留转换类的旧版本号。