谷本 心 in せろ部屋

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

はじめよう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を確認します。

C:\Work>jps
30924 Bootstrap
30868
33212 Jps

これで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!

正常に動いていることが分かりました。


とっても簡単でしたね!