少し JVMTI を触ってみた.AddTracer では今まで tracer 埋め込み処理が必要だった.それをクラスロード時に動的に埋め込めるようにした.すなわち,今までは静的にしか AddTracer を起動することができなかったが,本来動かしたいアプリケーションを実行するときに同時に AddTracer を起動させることが可能になった.
ただ,コンパイルが環境によっても変わってくるし,JDK 5.0 以降しか使えないので,まだ未公開.
以下の手順で実行している.
1. JVM 初期化時に AddTracer がロードできるようクラスパスを追加.
2. JVM 初期化終了後,AddTracer をロードし,new する.
3. クラスロードフックを設定.これでクラスがロードされる直前でバイトコードに対し,処理を行うことができる.
4. クラスロード直前のバイトコードに対して AddTracer を適用.
5. 以下のような実行だけで OK.事前に tracer を埋め込む必要もなくなった.
$ javac HelloWorld.java $ java -agentlib:addtracer HelloWorld <!-- begin Method HelloWorld#main // line 3 defined in - --> args[0-0] * assignment // line 3 args.length 0 assingment // line 3 java.lang.System#out<s> java.io.PrintStream@1a786c3 reference // line 3 Hello World! <!-- end Method HelloWorld#main // - ending at line 4 -->
うーん,便利だ,JVMTI.