Eclipseでリモートデバッグをする方法

Tomcatを使用する場合と、OC4Jを使用する場合の両方で試してみた。
意外にサクサク動く。

Tomcatを使用する場合の設定

$ cd $TOMCAT_HOME/bin
$ ./catalina.sh jpda start

起動時にjpda startとするだけで動く。

Oracle Application Server(OC4J)を使用する場合の設定

$ cd $ORACLE_HOME/opmn
$ vi conf/opmn.xml
...
<ias-component id="oc4j01" status="enabled">
  <process-type id="oc4j01" module-id="OC4J" status="enabled">
    <module-data>
      <category id="start-parameters">
        <data id="java-options" value="-server -Djava.security.policy=$ORACLE_HOME/j2ee/oc4j01/config/java2.policy -Djava.awt.headless=true -Dhttp.webdir.enable=false -XX:MaxPermSize=128M -Xms512M -Xmx1024M -XX:AppendRatio=3 -Dcom.sun.management.jmxremote"/>
      </category>
...

id="java-options"のvalueの最後に、

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

を追加する。
変更したら再起動する。

$ bin/opmnctl stopall
...
$ bin/opmnctl startall
...

Eclipseの設定

Menu > Run > Debug Configurationsを開く。
Remote Java Applicationを追加して、以下の項目を入力する。

Debugボタンを押すとリモートデバッグが開始される。
(ローカルでのデバッグと違い、パースペクティブが切り替わらず空気のように始まる)


あとはブレークポイントを設定した後にブラウザで画面を表示させればデバッグできる。

エラーが出る場合

以下のようなエラーが出る場合は、以前のコネクションが残ったままになってます。
複数人で使うサーバの場合、同時には1人だけしか接続できないという点に注意。

Failed to connect to remote VM. Connection refused.

java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:520)
at java.net.Socket.connect(Socket.java:470)
at java.net.Socket.<init>(Socket.java:367)
at java.net.Socket.<init>(Socket.java:180)
at org.eclipse.jdi.internal.connect.SocketTransportService$2.run(SocketTransportService.java:136)
at java.lang.Thread.run(Thread.java:595)