【发布时间】:2016-07-29 14:13:40
【问题描述】:
在我的 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();
}
}
// ...
非常欢迎任何帮助。
【问题讨论】: