在我的 Java 代理中,我使用 ASM 来检测类。我试图用 try/catch 包装特定的方法,加上跟踪 methodEnter
和 methodExit
。
使用“-noverify”
,代码可以完美运行。
如果没有此选项,它会失败并显示 VerifyError
(“此位置的预期堆栈映射帧”)——显然是因为我没有调用访问帧。
我将 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 .
关于java - 通过 ASM 在字节码中添加 try/catch block 时出现VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38661035/