谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

BTraceの制限事項

BTraceは、メソッドのIn/Outや、エラー発生時、あるいは定期実行など
いくつかのタイミングで、処理を埋め込む事ができる、とても便利なツールです。


しかも流行りの(しかしググっても全然ヒットしない)オンデマンドアタッチと
BCIを使っているので、アプリケーションの起動中に、ソースを改変せずに、
処理を埋め込むことができるスグレモノです。


そんなBTraceですが、安全性を高めるためなのか、かなりの制限事項があります。
BTrace User's Guideにも書いている制限事項を訳しておきましょう。

  • オブジェクトの生成ができない。
  • 配列の生成ができない。
  • 例外をスローできない。
  • 例外をキャッチできない。
  • 任意のインスタンスメソッドやstaticメソッドの呼び出しができない(BTraceUtilsを除く)
  • 埋め込み対象クラスのクラス変数や、オブジェクトのインスタンス変数に値を代入できない。
    • ただしBTraceクラス自身のstaticフィールドには代入可能。
  • インスタンス変数や、インスタンスメソッドは作成できない。
    • static public voidメソッドだけ作成できる。
    • 変数は全てstatic。
  • 外部クラス、内部クラス、ローカルクラスは作成できない。
  • synchronizedブロックやメソッドは作成できない。
  • ループ(for、while、do〜while)は利用できない。
  • 任意のクラスをextendsして作成することはできない。super classはjava.lang.Objectのみ。
  • interfaceをimplementsすることはできない。
  • assert文を利用することはできない。
  • クラスリテラルHoge.class)は利用できない。


ビックリするほど制限だらけです。
実際に破ったらどうなるのでしょうか、試してみましょう。

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

@BTrace
public class HelloWorld {
    @OnMethod(
        clazz="tutorial.action.EmployeeAction",
        method="edit"
    )
    public static void func() {
        File file = new File();
        println("about to start editing!");
    }
}

import文すら書かない手の抜きようですが、これで動かしてみましょう。

C:\Work>jps
7940 Jps
3940 Bootstrap

C:\Work>btrace 3940 HelloWorld.java
エラー:HelloWorld.java:18:object creation is not allowed
BTrace compilation failed

コンパイルに失敗したようです。
import云々以前に、newという単語に引っ掛かっているようですね。


その後も色々試してみたところ、

  • ○ : String str1 = "Hoge";
  • × : String str2 = new String("Hoge");
  • ○ : Integer i = 5;
  • × : Integer j = Integer.valueOf(5);
  • × : Integer k = new Integer(5);
  • ○ : Boolean b = Boolean.TRUE;

という状態でした。


安定動作させるための制限なのか、
あるいは内部実装による制限なのかは分からないのですが、
いずれにせよ、BTraceクラスにはこうした強い制限があります。


HelloWorld.classを作成した後に、強引に書き換えたらどうなるんだろう、
なんて興味は尽きなかったりもしますが、そういう楽しみは残しておきましょう。