2011-01-28 7 views
1

私は、メソッドの最初の行(initメソッドとclinitメソッドを除く)にSystem.out.println()を追加しようとBCELを使用しています。Java:BCELを使用してすべてのメソッドにデバッグ呼び出しを追加

これは、(いくつかの擬似付き)私のコードの気圧のとき:

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"))); 

編集したクラスは、バイトコードで正常に見えるが、何らかの理由でクラスは、この後に動作しません。私が間違っていることはありますか?

答えて

1

あなたは2つの引数を押していますが、いくつかの方法では、そのメソッドの最大スタックサイズよりも大きいかもしれません。メソッドの最大スタックサイズも調整する必要があります。あなたがてjavapの出力を見れば

あなたが解決2.

+0

これを行うには、コードの後ろにMethodGenクラスのsetMaxStack()メソッドを追加してください。 –

1

問題にそれをバンプする必要がスタックが< 2である方法のため

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

が表示されます、私は.addUtf8代わりの.addString

を使用していました
関連する問題