在我的Java代理中,我正在使用ASM检测类。我试图用try / catch包装特定的方法,再加上跟踪methodEnter
和methodExit
。
使用"-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。