リモートデバッグとは、JavaVMプロセスとTCP/IP通信しながらデバッグを行う仕組みを利用したデバッグ手法を指します。
TCP/IP通信ですから、Eclipseが動作しているマシンとは別のマシンで動作しているJavaプロセスと通信してデバッグすることもできます。デバッグ対象は別OSでもいいですし、Eclipseが導入されている必要もありません。
俺は恥知らずなJava使いなので今までこの機能の存在知らなかった……ので、試す。書いてあることはEclipse wikiとほとんど同じことです。
こんな環境でやりました
- windows XP
- jdk 1.6.0_16
- Eclipse 3.7
普通のJavaアプリケーション
まずはEclipseでJavaプロジェクトを作って適当なクラスを作る。
public class Hello { public static void main(String[] args) { System.out.println("Hello World"); } }
作ったクラスをコマンドプロンプトからjavaコマンド叩いて起動する。下記の例はリッスンするポートを8200にしているが、任意の番号で良い。
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8200" Hello
を実行すると、
Listening for transport dt_socket at address: 8200
が表示されれば、デバッグされる側は準備OK
次はデバッグする側の準備。EclipseでRun -> Debug Configurations を選びRemote Java Applicationを右クリックしてNewを選ぶ。Projectにさっき作ったEclipseのプロジェクトを指定し、Portは8200(上で指定したaddressと同じ値)にする。デバッグ対象のアプリはローカルマシンで動かすので、Hostはlocalhostのまま。
JBoss 7.1のWebアプリケーション
に、TomcatやらWebLogicやらJBossなど、よくありがちなケースでの設定例が書いてある。ここでは折角なのでJBoss 7.1を使ってみる。
まずはEclipseで適当にDynamic Web Projectを作って適当なサーブレットを作るなりなんなりして、warファイルを$JBOSS_HOME/standalone/deploymentsに配備する。
$JBOSS_HOME/bin/standalone.conf.batに、リモートデバッグ用の設定サンプルが書かれている。
rem # Sample JPDA settings for remote socket debugging
rem set "JAVA_OPTS=%JAVA_OPTS% -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
なので、コメントアウトを外す。addressもそのまんまでもいいのだが、今回は8200にする。
set "JAVA_OPTS=%JAVA_OPTS% -Xrunjdwp:transport=dt_socket,address=8200,server=y,suspend=n"
$JBOSS_HOME/bin/standalone.batを叩いてJBossを起動する。
Calling "C:\(省略)\bin\standalone.conf.bat"
===============================================================================JBoss Bootstrap Environment
JBOSS_HOME: C:\jboss-as-7.1.0.CR1b
JAVA: C:\Java\jdk1.6.0_16\bin\java
JAVA_OPTS: -Dprogram.name=standalone.bat -Xms64M -Xmx512M -XX:MaxPermSize=256M
-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000
-Dorg.jboss.resolver.warning=true -Djboss.modules.system.pkgs=org.jboss.byteman
-Xrunjdwp:transport=dt_socket,address=8200,server=y,suspend=n -server===============================================================================
Listening for transport dt_socket at address: 8200
(以下略)
ログにlistenしてることが出れば、デバッグされる側のアプリケーションサーバは準備OK
次はデバッグする側の準備……は普通のJavaアプリケーションでやったのと同じ設定で良い。ソースコードにブレークポイントを設定して、デバッグ起動すると、リモートデバッグが出来る。
デバッガする側は接続切っても、デバッグされる側は止まらないのが良いですね。Webアプリの場合、localhostでやってる限りはそれほど恩恵は感じないですが、アプリケーションサーバが別マシンであるとかの場合は重宝します。