ローカルマシン以外で動いているjvmをEclipseでデバッグする


2011年 03月 22日

Javaの開発者でEclipseを利用されている方は多いと思います。 通常のEclipseをインストールするとJavaの開発用ツールが一式はいりますが、その中にJavaのデバッグツールも含まれます。

TomcatやJetty、WebLogicなどのWebアプリケーションサーバ上で動くWebシステムを開発する際、ローカルにWebアプリケーションサーバを入れその上で動かしながら開発を進めていくのが一般的だと思います。

EclipseではTomcatプラグインなどWebアプリケーションサーバ固有のプラグインでのデバッグ実行、もしくはEclipseに「サーバ」としてWebアプリケーションサーバを登録し、そこからデバッグ起動することでEclipseからデバッグをすることができます。では、手元のマシン(ローカル)以外で動いているアプリケーション(Webアプリはもちろんバッチなど)はどのようにしてデバッグすればよいのでしょうか。
安心してください。Eclipseにはローカルマシン以外のjvmに接続してデバッグする機能が備わっています。


以下に手順を書いていきます。

まず初めに、リモートデバッグ対象のアプリケーションをデバッグ可能なようにして起動させます。

$ java hoge -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n
のように
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=n
を追加して起動させます。Tomcatなどで動いているWebアプリケーションをリモートデバッグする場合は、TomcatなどのWebアプリケーションサーバの起動オプションにつけます。

jvm起動時に追加した値で重要なのが、suspendの値です。上記の例では「n」となっています。この値は、デバッグ接続がされるまでアプリケーションの起動をとめるか否かをしめします。「n」となっている場合は通常と同じように起動しますが、「y」とした場合、これから説明するEclipseなどでデバッグ接続をしない限りアプリケーションは起動しなくなります。
Webアプリケーションのデバッグを行う場合は「n」を、それ以外の場合は「y」を設定するとよいでしょう。


次にEclipseで対象のアプリケーションにデバッグ接続する方法です。
Eclipseのメニューから[実行]-[デバッグ構成]を選択すると、以下のように表示されます。

remoteDebug02.PNG

と表示されます。

早速、必要な情報を埋めて生きます。

[名前]はわかりやすいもので任意でつけてください。
[プロジェクト]は、デバッグ対象となるアプリケーションのプロジェクトを指定します。複数のプロジェクトに依存している場合、起動したmainメソッドが含まれているものを指定します。
[接続プロパティー]-[ホスト]にはデバッグ対象のアプリケーションが動いているマシン名もしくはIPを、[ポート]は「8000」とします。ポート番号はデバッグ対象起動時の引数
address=8000
と一致させれば値は変更して問題ありません。

以上、値を設定した上で[デバッグ]ボタンを押下するとデバッグが開始されます。

Eclipse単体で実行とデバッグを行うのに比べて複雑ではありますが、
  1. jvmでデバッグポートを開く
  2. デバッガでデバッグポートに接続しに行く
という、Eclipseが裏で行っていることがわかればさほど難しいものではありません。
ここでピンと来るひともいるかもしれませんが、所詮はソケット通信なのでsshでポートフォワードも可能です。

デバッガで接続させるということは一時停止などできるのでデバッグだけでなくイレギュラーケースのテストにも応用できます。実際、手元では無理で特定の環境でしか実行させることができないバッチプログラムのイレギュラーテストを、デバッグモードを利用して行ったことがあります。

普段使うものではないかもしれませんが、「こういう方法もある」と知っておくといざというときに役に立つのではないでしょうか。