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とか)で、煮るなり焼くなり好きにして下さい。

以下を参照してください。
僕が書くよりよっぽど分かりやすいので。

リモートデバッグ - 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 の使い方を覚えてから、
EclipseTomcatプラグインを入れるのを止めました。



2.好きな時だけ Debug 出来る。


デバッグする側”(例えば、Eclipse)から、
デバッグされる側”(例えば、Tomcatや、サンプルアプリなど)に、
接続してから切断するまでの期間のみ、デバッグ実行となります。
接続する前・切断した後は、通常の実行と変わりません。


Q.何がそんなにうれしいんだ?
A.こんな、シュチュエーションを思い浮かべてください。
ブレークポイントをベタベタ何十個も張っている。
なのに、肝心の箇所を通るのを見逃してしまった。
あとは見ても仕方がないんだが、プログラムの実行が終了するまでに、
何度も何度もブレークポイントに引っかかってしまい、イライラする。
スムーズに終了まで流すには、ブレークポイントを外すするしかない。
でも、もう一度Debugdする時に、ブレークポイントが必要なので、外したくない。」


こんな場合、どうします?
ブレークポイントで止まる度に、F8を連打する?
ブレークポイントを外して、F8一回で、プログラム終了まで実行。再度Debugする前に、ブレークポイントを張りなおす?


Remote Debug ならば、
ブレークポイントを付けたまま、”切断”するだけで、プログラム終了まで実行。
といった、虫の良い話が可能になるんです。