В своем 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();
}
}
// ...
Любая помощь очень приветствуется.