[英]Bytecode instrumentation generating java verifier error
我正在使用ASM来为Java程序进行字节码检测。 我正在做的事情很简单-插入一个方法时,如果指令是PUTFIELD,只需在指令前执行DUP_X1,然后访问PUTFIELD并注入带有包含DUP堆栈项的自变量的函数调用。
public void visitFieldInsn(
int opcode,
String owner, // owner of this field...
String name,
String desc) {
boolean did_dup = false;
if(opcode == Opcodes.PUTFIELD) {
if(!owner.equals("java/lang/System")) {
if (desc.startsWith("L")) {
mv.visitInsn(Opcodes.DUP_X1);
did_dup = true;
}
}
}
mv.visitFieldInsn(opcode, owner, name, desc);
if (did_dup) {
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/ASide", "updateG", "(Ljava/lang/Object;Ljava/lang/Object;)V");
}
}
代码分别如下所示:
public void setA(ClassA classa)
{
refA = classa;
eyeColor = classa.eyeColor;
}
public void setA(ClassA classa)
{
ASide.updateG(refA = classa, this);
ASide.updateG(eyeColor = classa.eyeColor, this);
}
但是,当我运行检测代码时,我得到:
java.lang.VerifyError:期望在堆栈上找到对象/数组
您能对此提供任何帮助吗?
仪器上有一些孔。 例如,它不会检查您是否在静态方法中,因此存在此变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.