作成 2003/5/28
微妙に前々から気になっていたリモートデバッグを試してみました。実験環境
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から行ってみましょう。
先ほどのServerクラスをEclipseのプロジェクト上に作っておきます。 でもって、上と同じようなオプションをつけてServerクラスを起動します (コマンドラインからで可)。
Eclipseのメニューで、実行→デバッグ...を選択し、起動構成の画面を開きます。
「リモートJavaアプリケーション」を選択し、「新規」ボタンを押します。
以下の画面のように値を設定します。
プロジェクトはServer.javaを含む作成したプロジェクト。 ポート番号はServerを起動するときに指定したポート番号を指定します。
「デバッグ」ボタンを押します。
EclipseのGUI上でリモートデバッグが可能です。
やることは上の流れと同じことです。 %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になっているので、アタッチしないと、 サーバプログラムが進みません。
既にプロジェクトとデプロイ可能な設定が構築済とします。 ここでは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