「Java」リモートデバッグ

Java でリモートデバッグしてみたので、その時のメモ。

今回はソケット通信するアプリケーションを作成してやってみました。
以下の感じで、クライアントからサーバに接続すると、「Hello」と返ってきます。
リモートデバッグすることが目的のため、一度の通信の受け付けでサーバは終了しちゃいます。
Eclipse 使って作成してます ( サーバ側のソースについては、サーバにコピーもしておく )

■ クライアント側

package client;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.Socket;

public class ClientSample {
	public static void main(String[] args) {
		try {
			Socket socket = new Socket();
			socket.connect(new InetSocketAddress("localhost", 8888));
			DataInputStream dis = new DataInputStream(socket.getInputStream());
			BufferedReader br = new BufferedReader(new InputStreamReader(dis));
			System.out.println(br.readLine());
			
			br.close();
			dis.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

■ サーバ側

package server;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSample {
	public static void main(String[] args) {
		
		String s = "Hello";
		
		try {
			ServerSocket ss = new ServerSocket(8888);
			Socket socket = ss.accept();
			DataOutputStream dos = new DataOutputStream(
					socket.getOutputStream());
			dos.writeBytes(s);
			
			dos.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

一応 API ドキュメント。
・Socket (Java Platform SE 6)
http://docs.oracle.com/javase/jp/6/api/java/net/Socket.html
・ServerSocket (Java Platform SE 6)
http://docs.oracle.com/javase/jp/6/api/java/net/ServerSocket.html
・DataInputStream (Java Platform SE 6)
http://docs.oracle.com/javase/jp/6/api/java/io/DataInputStream.html
・DataOutputStream (Java Platform SE 6)
http://docs.oracle.com/javase/jp/6/api/java/io/DataOutputStream.html

コンパイルする。今回リモートデバッグの対象は「サーバ側」のため、サーバ側のソースをコンパイルする際は "-g" オプションを指定して、デバッグ情報が生成されるようにしておく。

javac -g server/ServerSample

※ 一応、普通に動作することを確認しておく。


まず、サーバ側を起動しますが、リモートデバッグするためのオプションをつけて起動します。

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9999 server.ServerSample

"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=9999" あたりがそうみたいです。
以下の Web ページに情報がありました。
Eclipse を使ってリモートで Java アプリケーションをデバッグする
http://www.ibm.com/developerworks/jp/opensource/library/os-eclipse-javadebug/

一応、上記のオプションについてオラクル社のドキュメントも探しましたが、私では情報みつけられず・・・
フォーラム情報にちょろっとあったぐらい ( WebLogicJRockit あたりならそれらしきのがありましたが )。
・how to set the *-Xdebug -Xrunjdwp...... in JDev... | Oracle Forums
https://forums.oracle.com/thread/900976

次に Eclipse の [Run] - [Debug Configurations...] - [Remote Java Application] をダブルクリックして、[Host] の箇所にサーバ側プログラムが起動する IP アドレスを、[Port] の箇所にオプションに指定したポート番号 ( 上記だと 9999 ) を指定する。
[Apply] 押下で設定反映後、[Debug] を押下する。
Eclipse 上でサーバ側プログラムに適当にブレークポイントを貼っておく。

この状態で、クライアント側のプログラムをデバッグ実行してやると、上記で設定したブレークポイントの箇所で実行がちゃんと止まることが確認できる。また、変数の内容確認とか、ステップ実行もできたりします。

以上です。

ちょっと内容がまとまってない感じですが、その辺りはご了承ください・・・
疲れたので、今日はもう寝ます。

[ 環境情報 ]
■ クライアント側
Windows 7
Eclipse 4.2
Java 6 Update 34

■ サーバ側
CentOS 6.2
Java 6 Update 34