在我的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();
}
}
// ...
非常欢迎任何帮助。
答案 0 :(得分:0)
乍一看并且没有看到导致问题的完整代码,您混合了super.visitXX()和mv.visitXX()调用。
此外,不必加载依赖类。您可以提供自己的ClassWriter.getCommonSuperClass()实施。例如,请参阅ClassWriterComputeFramesTest。