Java: добавление вызова отладки для каждого метода с помощью BCEL - PullRequest
1 голос
/ 28 января 2011

Я работаю с BCEL, пытаясь добавить вызов System.out.println () в первую строку каждого метода (кроме методов init и clinit), чтобы увидеть, какие методы вызываются и когда

Это мойcode atm (с некоторыми псевдо):

    Instruction ins = null;
    f (first instruction is ALOAD_0) {
       ins = get next instruction
    } else {
       ins = this instruction;
    }

    list.insert(ins, new GETSTATIC(cgen.getConstantPool().addFieldref("java/lang/System", "out", "Ljava/io/PrintStream;")));
    list.insert(ins, new LDC(cgen.getConstantPool().addUtf8("debug message")));
    list.insert(ins, new INVOKEVIRTUAL(cgen.getConstantPool().addMethodref("java/io/PrintStream", "println", "(Ljava/lang/String;)V")));

Отредактированный класс выглядит хорошо в байт-коде, но по какой-то причине класс не будет работать после этого.Есть что-то, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 29 января 2011

Проблема решена, я использовал .addUtf8 вместо .addString

1 голос
/ 29 января 2011

вы выдвигаете два аргумента, и для некоторых методов это может быть больше, чем максимальный размер стека для этого метода. Вам также потребуется настроить максимальный размер стека для метода.

Если вы посмотрите на вывод javap, вы увидите

Code:
    Stack=4, Locals=8, Args_size=3

для методов, где Stack <2, вам нужно увеличить его до 2. </p>

...