JDBとリモードデバッグ

作成 2003/5/28

微妙に前々から気になっていたリモートデバッグを試してみました。

実験環境

JDBを使ってみる

JDBを使ってみる

jdbはSDKに標準に付属しているJavaデバッガです。 コマンドラインから、ソースにブレークをかけたり、ステップ実行することができます。詳細はJDKのドキュメントに書いてあります。

http://java.sun.com/j2se/1.4/ja/docs/ja/tooldocs/win32/jdb.html

jdbでは、ローカルのデバッグだけでなく、リモートデバッグが可能です。 ここでは、簡単にjdbでリモートデバッグを行ってみます(JBossとは関係ない、 シンプルなJavaアプリケーションで実験します)。

例として、以下のようなひたすらループするサーバ(?)プログラムを作成します。

Server.java

public class Server {
    public static void main(String[] args) throws Exception{
        for(int i=0; i<300; i++){
            System.out.println(i);
            Thread.sleep(1000);
        }
    }
}

Serverクラスをコンパイルします。 コマンドプロンプトを開き、 以下のようなオプションでServerクラスからプログラムを起動します。

java -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=12345,server=y,suspend=n Server

次に別のコマンドプロンプトで、jdbからこのプログラムにアタッチします。

jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=12345

ブレークをかけたり、ステップ実行したりできます(赤字はコメント)。

C:\app\eclipse21a\jdb01>jdb -connect com.sun.jdi.SocketAttach:hostname=localhost
,port=12345
uncaught java.lang.Throwable を設定しました
保留した uncaught java.lang.Throwable を設定しました
jdb の初期化中です...
> stop at Server:4←ブレークポイント設定
ブレークポイント Server:4 を設定しました
>
ブレークポイントのヒット: "スレッド=main", Server.main(), line=4 bci=5
4                       System.out.println(i);

main[1] print i←ローカル変数の表示
 i = 11
main[1] clear Server:4←ブレークポイントの解除
削除済み: ブレークポイント Server:4
main[1] step←ステップ実行
>
ステップ完了: "スレッド=main", Server.main(), line=5 bci=12
5                       Thread.sleep(1000);

main[1] run←継続実行
>

Eclipseからアタッチ

さすがにコマンドラインでソースデバッグするのも辛いので、 今度は、アタッチをEclipseから行ってみましょう。

先ほどのServerクラスをEclipseのプロジェクト上に作っておきます。 でもって、上と同じようなオプションをつけてServerクラスを起動します (コマンドラインからで可)。

Eclipseのメニューで、実行→デバッグ...を選択し、起動構成の画面を開きます。

「リモートJavaアプリケーション」を選択し、「新規」ボタンを押します。

以下の画面のように値を設定します。

(クリックで大画面)

プロジェクトはServer.javaを含む作成したプロジェクト。 ポート番号はServerを起動するときに指定したポート番号を指定します。

「デバッグ」ボタンを押します。

EclipseのGUI上でリモートデバッグが可能です。

JBossでリモートデバッグしてみる

リモートデバッグモードでrun

やることは上の流れと同じことです。 %JBOSS_HOME%/bin/run.batを修正します。

run.batの70行目付近にJAVA_OPTSのremコメントをはずし、 太字の部分を有効にします。

...
rem JPDA options. Uncomment and modify as appropriate to enable remote debugging.
set JAVA_OPTS=-classic -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=y %JAVA_OPTS%

echo ===============================================================================
...

JBossを起動します。 なお、この設定では、suspend=yになっているので、アタッチしないと、 サーバプログラムが進みません。

Eclipseクライアントからアタッチする

既にプロジェクトとデプロイ可能な設定が構築済とします。 ここではXDocletの実験で使ったプロジェクトを流用しました。

デプロイしときます(後からしても可)。

Eclipseのメニューから実行→デバッグ...を選択し、起動構成を開きます。

作成したプロジェクトと、ポート番号(ここでは8787)を指定し、「デバッグ」ボタンを押します。

ブレークを設定して、クライアントプログラムから実行すると、デバッグがかかります。

JBossを起動したままで、 デプロイ→アタッチ→ソースデバッグ→アタッチ解除 を繰り返すことができます。

できればHotSwapしたいが。。。実際はどんなデバッグが一番素早く行えるだろうか?
改めてやってみると普通に出来ました。 IDEのコンパイラとAntのコンパイラで作成されるクラス(場所?微妙に謎)が違うのが問題だったっぽい。
イチイチデプロイしなくても、fix-and-continueでソースデバッグが可能です。

参考

JBossのリモートデバッグ手順(JBoss2.4.3+Forte3.0)
http://homepage2.nifty.com/neverbird/obsolete/articles/debug.html

WebLogicでのリモートデバッグ
http://w3.cube-web.net/eclipse/index.php?%5B%5B%A5%EA%A5%E2%A1%BC%A5%C8%A5%C7%A5%D0%A5%C3%A5%B0%5D%5D


UP TOP