在我的Java代理中,我正在使用ASM检测类。我试图用try / catch包装特定的方法,再加上跟踪methodEntermethodExit

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

没有此选项,它将失败并显示VerifyError(“此位置的预期堆栈图框架”),这显然是因为我不调用visitFrame。

我将COMPUTE_MAXS用于ClassWriter,将EXPAND_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();
    }
}

// ...


任何帮助都非常欢迎。

最佳答案

乍一看,没有看到引起问题的完整代码,您正在混用super.visitXX()和mv.visitXX()调用。

同样,不必加载依赖类。您可以提供自己的ClassWriter.getCommonSuperClass()实现。例如,请参见ClassWriterComputeFramesTest

08-05 16:55