Remote Debug のススメ
wakhok の夜学で約束した、Remote Debug の方法です。
Apache Tuscany の Code Reading に役立つかもしれません。
- 要は? 2006-07-05 追記 2006-07-25誤記修正 server=[y|n],suspend=y → server=y,suspend=[y|n]
要は、デバッグしたいプログラムを java コマンドで実行する時に、
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=[y|n],address=[ポート番号]
というオプションを付けるだけです。
あとは、Remote Debug に対応したデバッガ(Eclipseとか)で、煮るなり焼くなり好きにして下さい。
- APサーバ上のプログラムをデバッグ
以下を参照してください。
僕が書くよりよっぽど分かりやすいので。
リモートデバッグ - EclipseWiki
http://eclipsewiki.net/eclipse/?%A5%EA%A5%E2%A1%BC%A5%C8%A5%C7%A5%D0%A5%C3%A5%B0
Eclipse以外の IDE でも、Remote Debug は出来るはずです。
確認はしていませんが、出来ないはずがありません。
IDE側の操作さえ覚えれば、他はまったく同じはずです。
APサーバ上のプログラムをデバッグする場合と同じです。
java コマンドが起動するのが、”APサーバ”か”Javaアプリ”かの違いがあるだけです。
<デバッグされる側のJavaアプリの実行例>
C:\tuscany-incubating-M1\samples\sca\helloworld>java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 -cp ../../../lib/tuscany-runtime-incubating-M1.jar;target/sample-helloworld-incubating-M1.jar helloworld.HelloWorldClient
- Remote Debug の option の要
Remote Debug で重要な option は、
address と、suspend の、2つです。
(というか、僕は他のオプションの意味を知りません。)
1.address
address は、Port番号の指定に使います。何番でも好きなPort番号を指定できます。
何のPort番号なのかというと、
”デバッグされる側”(例えば、Tomcatや、サンプルアプリなど)が、
”デバッグする側”(例えば、Eclipse)からの接続を待ち受けるためのポート番号です。
2.suspend
suspend は、”デバッグされる側”と”デバッグする側”が待ち合わせをする(suspend=y)か、しない(suspend=n)かを設定します。
Remote Debug は、”デバッグされる側”を起動してから、”デバッグする側”が接続に行きます。
なので、helloworldサンプルのように、起動したすぐ後に終わってしまうプログラムだと、
suspend=y(待ち合わせをする設定)にしないと、Debug を始める前に、プログラムが終わってしまいます。
Tomcatの起動時に走るロジックをDebugしたい。といった場合にも、
suspend=y(待ち合わせをする設定)は有効です。
- なぜ Javaアプリも Remote Debug 出来るの?
Remote Debug は、"J2SE"の機能です。J2EEの機能でも、APサーバの機能でもありません。
なので、ごくごく小さなJavaアプリであろうが、
APサーバのような巨大なJavaアプリであろうが、
同じ手順でデバッグできるんです。
- Remote Debug の利点
Remote Debug のチャームポイントは、以下の2点です。
1.IDE上で動かさなくても Debug 出来る。
Remote Debug の使い方を覚えてから、
Eclipse に Tomcatプラグインを入れるのを止めました。
2.好きな時だけ Debug 出来る。
”デバッグする側”(例えば、Eclipse)から、
”デバッグされる側”(例えば、Tomcatや、サンプルアプリなど)に、
接続してから切断するまでの期間のみ、デバッグ実行となります。
接続する前・切断した後は、通常の実行と変わりません。
Q.何がそんなにうれしいんだ?
A.こんな、シュチュエーションを思い浮かべてください。
「ブレークポイントをベタベタ何十個も張っている。
なのに、肝心の箇所を通るのを見逃してしまった。
あとは見ても仕方がないんだが、プログラムの実行が終了するまでに、
何度も何度もブレークポイントに引っかかってしまい、イライラする。
スムーズに終了まで流すには、ブレークポイントを外すするしかない。
でも、もう一度Debugdする時に、ブレークポイントが必要なので、外したくない。」
こんな場合、どうします?
・ブレークポイントで止まる度に、F8を連打する?
・ブレークポイントを外して、F8一回で、プログラム終了まで実行。再度Debugする前に、ブレークポイントを張りなおす?
Remote Debug ならば、
・ブレークポイントを付けたまま、”切断”するだけで、プログラム終了まで実行。
といった、虫の良い話が可能になるんです。