Android、Java、Web系、Linux、マラソン等の備忘録

2011/09/29

LinuxのJavaアプリケーションをリモート(Windows)のEclipseでデバッグ

0 件のコメント

試した環境


■実行環境

  • OS:Linux CentOS 5
  • java version "1.6.0_21"

■デバッグ環境

  • OS:Window XP SP3
  • java version "1.6.0_25"
  • Eclipse:Eclipse IDE for Java Developers Version: Indigo Release

 

Eclipseで提供されているコネクタについて


Eclipseで提供されているコネクタは2種類あります。

  • Socket Attach
  • Socket Listen

 
socketattachlisten

Socket Attachを利用した場合は、この環境ではLinux側が接続されるホストになり、逆にSocket Listenの場合はEclipse側が接続されるホストになります。

どちらでやってもJavaアプリのデバッグは行えます。大まかな指針としては、計算リソースから考えてスペックの強力な方をホストにするのが良いそうです。実行環境がモバイル端末とかなら明らかにホストはEclipse側でしょうか。。

また、コネクタに8000ポートを使うのでファイアウォールなど設けてる場合はポートを開ける必要があります。この環境で言えば、LinuxはWebサーバとして公開しているので、無駄にポートは開けたくないところ。。というわけで、Eclipse側をホストにするSocket Listenを採用したいと思いますが、やり方自体はそんなに大きく変らないので、両方試してみました。

デバッグ用のサンプルコード

サンプルコードというか、とりあえず動くかどうかが分かれば良い程度のコード。 System.out.printlnあたりにブレークを貼って、ブレークポイントに止まる事をEclipse上で確認。

package remotedebug;

public class RemoteDebugHello {

/**
* @param args
*/
public static void main(String[] args) {
System.out.println("Hello Remote Debug!");

}

}


Linuxマシンで実行しやすようにプロジェクトをJARファイルとして出力。




  1. プロジェクトを右クリックしてExportを選択


  2. JavaのRunnable JAR fileを選択


  3. 出力したいクラスを選択し、JARファイル名を入力してそのままFinishボタンを押下



WS000220



出力されたJARファイルをLinuxマシンにアップロードして、動くかどうか実行してみる。





$ java -jar RemoteDebugHello.jar




Socket Attachモードでデバッグしてみる





前述した通り、ポート8000を使うので、Linux側のファイアウォールに8000を使えるようにしておく。ポートを開けないで、デバッグを行おうとすると、Eclipse側で「Failed to connect to remote VM. Connection timed out.」というエラーダイアログが出ました。




以下のコマンドでLinux側のホストの準備をさせておきます。




$ java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar RemoteDebugHello.jar




Eclipse側は、メニューで Run (実行) > Debug Configurations (デバッグの構成) の順にクリックし、さらに Remote Java Application (リモート Java アプリケーション) をダブル・クリックします。



WS000213 




  • Name:(任意の名前)


  • Project:Browseボタンでサンプルコードのプロジェクトを選択


  • Connection Type:Standard(Socket Attach)を選択


  • Host:(LinuxマシンのIPアドレス)


  • Port:8000



と設定。Allow termination of remote VMにチェックを付けると、アプリケーションのデバッグ中に接続先の VM を終了できるようになります。これでDebugボタン押下でデバッグが始まります。。。



ところが、「Failed to connect to remote VM. Connection refused. Connection refused: connect」というエラーダイアログ。。




原因はよくわかりませんが、ググってみると、VMを再起動させれば良いということで、上記のLinux側のコマンドを停止させ、再度コマンドを実行し、もう一度EclipseのDebugボタンを押下すると上手くいきました。




↓貼ってたブレークポイントに引っかかった(緑のライン)




WS000215





Socket Listenモードでデバッグしてみる





今度はEclipse側がホストになるので、Eclispse側から動かします。


先ほどのDebug Configurations画面でConnection Type:Standard (Socket Listen)を選択してDebugボタンを押下。



WS000217 


接続待機中と表示されます。


続いて、Linux側で以下のコマンドを実行します。






$ java -Xdebug -Xrunjdwp:transport=dt_socket,address=192.168.1.2:8000,suspend=y -jar Remo
teDebugHello.jar


上記の192.168.1.2の部分はWindowsマシンのIPアドレスに変更してください。



WS000219






ブレークポイントに引っかかりました。 



 

[参考文献]
Eclipse を使ってリモートで Java アプリケーションをデバッグする

0 件のコメント :

コメントを投稿