はじめようBTrace
BTrace means best trace -- よねのはてな
くっそー!
ということで、まずはBTraceを動かせる所までを紹介します。
https://btrace.dev.java.net/
ここからBTraceのバイナリをダウンロードして解凍します。
解凍後、取り回しやすくするために、
binディレクトリまでPATHを通しておくと良いでしょう。
次に、btrace.batを修正します。
Java6をC:\Program files以下にインストールしている場合に
(パスに空白が入っているせいで)正常動作しないためです。
%JAVA_HOME%/bin/java -Dcom.sun.btrace.probeDescPath=. -Dcom.sun.btrace.dumpClasses=false -Dcom.sun.btrace.debug=false -cp %BTRACE_HOME%/build/btrace-client.jar;%BTRACE_HOME%/build/asm-3.0.jar;%JAVA_HOME%/lib/tools.jar com.sun.btrace.client.Main %*
↓
"%JAVA_HOME%/bin/java" -Dcom.sun.btrace.probeDescPath=. -Dcom.sun.btrace.dumpClasses=false -Dcom.sun.btrace.debug=false -cp %BTRACE_HOME%/build/btrace-client.jar;%BTRACE_HOME%/build/asm-3.0.jar;"%JAVA_HOME%/lib/tools.jar" com.sun.btrace.client.Main %*
要は%JAVA_HOME%を含むパス(2箇所)をダブルクォートで括るだけです。
これでBTraceの実行環境が整いました。
続いて、デバッグ対象となるアプリケーションのセットアップを行ないます。
ここでは VisualVMでSAStrutsのプロファイリングなど試してみる その1 で使った
SAStrutsを利用することにしましょう。
続いて、アプリケーションのトレースを行なうスクリプトを記述しましょう。
スクリプトと言っても、Javaの文法をそのまま利用できます。
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() { println("about to start editing!"); } }
ここでは、BTraceのチュートリアルを少しだけ改変して、
「データベースを使ったサンプル (Employee)」の編集画面を開いた際に
メッセージを出すようなスクリプトを記述しました。
ファイル名は、HelloWorld.javaとします。
では、実際に動かしてみましょう。
まずは、デバッグ対象のアプリケーションを起動します。
BTraceは、Java6のオンデマンドアタッチを利用するため、
デバッグ対象アプリケーションの起動引数に、アレコレと指定する必要はありません。
いつも通りに、アプリケーションを起動してください。
(ただし、Java6で起動する必要があります)
デバッグ対象のアプリケーションを起動したら、
jpsコマンドや、VisualVMなどを使って、アプリケーションのPIDを確認します。
これでTomcatのPIDが「30924」であることが分かりました。
では、BTraceを起動してみましょう。
C:\Work>btrace 30924 HelloWorld.java
BTraceを起動したら、デバッグ対象のアプリケーションを動かします。
今回の例では、ブラウザで編集画面を表示するたびに、
コンソール上にメッセージが出力されます。
C:\Work>btrace 30924 HelloWorld.java
about to start editing!
about to start editing!
about to start editing!
about to start editing!
正常に動いていることが分かりました。
とっても簡単でしたね!