谷本 心 in せろ部屋

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

BTraceのコンパイラは何をやっているのか?

VisualVMのBTracePluginでは、入力された文字列をコンパイルするだけど
それをやっているのが、
net.java.btrace.visualvm.compiler.BCompiler#compile(String, String)
というメソッド。


これが何をやってるかっていうと、com.sun.btrace.compiler.Compilerを
クラスロードして、compileメソッドを叩いているだけ。


で、このcom.sun.btrace.compiler.Compilerクラスなんだけど、
引数にFileかファイルパスを要求してくるのが、ちょっとイケてない。


引数は文字列(ソースコード)だけで良いじゃんかよーって思いながら
ソースを読んでみたら、別にFileやファイルパスは必須ではなくて
JavaのCompilerAPIに渡す-sourcePathオプションに使っているだけだった。
後で試してみるけど、多分nullでも大丈夫そうだ。


ちなみに、com.sun.btrace.compiler.Compilerも、凝った実装をしているわけではなくて
Compiler APIを叩く時に、com.sun.btrace.compiler.Verifierという
BTrace独自のソースコードチェックを行っているだけだった。


このVerifierこそが、BTraceの一つの肝である「安全性」、
つまり「刺した時にアプリを壊さないために、強い制限を掛ける」ってことを
実現しているもので、BTraceの制限を緩めたいなら、
このVerifierを自前のものに差し替えてしまえば良さそうだ。


まぁ今回はそこまでやるつもりはないので、とりあえず、
com.sun.btrace.compiler.Compiler#compileメソッドを直接叩いてみることにする。