kagamihogeの日記

kagamihogeの日記です。

Eclipseのリモートデバッグ

リモートデバッグとは、JavaVMプロセスとTCP/IP通信しながらデバッグを行う仕組みを利用したデバッグ手法を指します。
TCP/IP通信ですから、Eclipseが動作しているマシンとは別のマシンで動作しているJavaプロセスと通信してデバッグすることもできます。デバッグ対象は別OSでもいいですし、Eclipseが導入されている必要もありません。

より抜粋

俺は恥知らずなJava使いなので今までこの機能の存在知らなかった……ので、試す。書いてあることはEclipse wikiとほとんど同じことです。

こんな環境でやりました

普通のJavaアプリケーション

まずはEclipseJavaプロジェクトを作って適当なクラスを作る。

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でやってる限りはそれほど恩恵は感じないですが、アプリケーションサーバが別マシンであるとかの場合は重宝します。