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

时间:2016-07-29 14:13:40

标签: java java-bytecode-asm

在我的Java代理中,我正在使用ASM检测类。我尝试使用try / catch包含特定方法,并跟踪methodEntermethodExit

使用"-noverify"代码可以完美运行。

如果没有此选项,则会失败并显示VerifyError("此位置的预期堆栈图框架") - 显然是因为我没有调用visitFrame。

COMPUTE_MAXS使用ClassWriterEXPAND_FRAMES使用ClassReader。我不能使用COMPUTE_FRAMES因为它需要在检测之前加载所有依赖类 - 这是不可能的。

我目前的代码:

// ...

@Override
protected void onMethodEnter() {
    visitLogMethodCallEntry();
}

@Override
public void visitCode() {
    super.visitCode();
    mv.visitLabel(startFinally);
}

@Override
public void visitMaxs(int maxStack, int maxLocals) {
    Label handler = new Label();
    mv.visitTryCatchBlock(startFinally, handler, handler, null);
    mv.visitLabel(handler);
    visitLogMethodCallException();
    mv.visitInsn(ATHROW);
    mv.visitMaxs(maxStack, maxLocals);
}

@Override
protected void onMethodExit(int opcode) {
    if (opcode != ATHROW) {
        visitLogMethodCallExit();
    }
}

// ...

非常欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

乍一看并且没有看到导致问题的完整代码,您混合了super.visitXX()和mv.visitXX()调用。

此外,不必加载依赖类。您可以提供自己的ClassWriter.getCommonSuperClass()实施。例如,请参阅ClassWriterComputeFramesTest