ひよっこ。

I want to…

Javaアプリのリモートデバッグ

Posted by hikaruworld : 2009 1月 26

Eclipseを用いたJavaアプリのリモートデバッグを試してみる。

ここを参考に実行してみた。

主な目的としては、ユーザに配布したJavaアプリに障害が発生した場合のリモートデバッグを行うことが主。
そこはちゃんとログを仕込んでおけよ!!と言われそうだが、仕込んでいても同期処理やPC特有の問題が発生したりしたので、保険ということで。

必要な構成は以下の通り。Hostをデバッカとして、GuestををJavaアプリとする。
Host:Java5以上。Eclipse3.4
Guest:Java5以上(実際はjava4以下でもできなくはないようだが、手元に環境がないので割愛)

主な流れとしては以下の通り。
1.Guest側でJVMをデバッグモードで起動する。この時に外部接続を受けるポートを設定しておく
2.Host側でGuest側のJVMに対して、1起動時に設定したポートに接続を行う。

テスト用に簡単なSwingでアプリを作成する。

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MainTest extends JFrame {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		MainTest mainTest = new MainTest();
		
		// Button 1
		JButton button1 = new JButton("btn1");
		button1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println("btn1 click!!");
			}
		});
		// Button 2
		JButton button2 = new JButton("btn2");
		button2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println("btn2 click!!");
			}
		});

		mainTest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainTest.setLayout(new FlowLayout());
		mainTest.add(button1);
		mainTest.add(button2);
		mainTest.setVisible(true);
	}

}

これをjarファイルに固めて、任意の場所に置く(仮にRemoteApp.jarとし、カレントディレクトリに配備する)。
jarファイルをjavaコマンドからデバッグモードで起動する。
参照サイトでは-Xdebugと-Xrunjdwpを使っているが、JDK5未満は使わないので、-agentlib:jdwpを使う。
javaコマンドのオプションに関してはjavadocを参照のこと。

java -agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000 RemoteApp.jar

※ JavaVM4以前の場合は -Xdebug, -Xrunjdwpを用いる必要がある。特に-XdebugはJavaVM5以上はjavadocにも書かれているように非推奨の機能で、
設定した場合でも内部的にはJVMDIではなく、JVMTIに置き換えられているので注意すること。以下引用。

-Xdebug
JVMDI のサポートを有効にして開始します。JVMDI は推奨されていません。また、J2SE 5.0 でのデバッグには使用されません。したがって、J2SE 5.0 でのデバッグには、このオプションは必要ありません。

問題ない場合は、実行後に以下のように出力され、アプリケーションがリスン状態になる。

Listening for transport dt_socket at address: 8000

この状態になったら、eclipseからdebug起動を行う。
1.実行→デバッグの構成
2.リモートJavaアプリケーションを選択し、右クリックして新規をクリック。
3.以下のように設定

  1. プロジェクト:対象のプロジェクトを設定
  2. 接続タイプ:接続(ソケット接続)
  3. 接続プロパティ(ホスト);localhost
  4. 接続プロパティ(ポート);8000
  5. リモートVMの終了を許可:チェッックする
    *デバッグを行っているeclipseから対象のアプリケーションの停止を行えるようにする設定

4.デバッグを実行

無事デバッグできることを確認。
結構便利使えそうあるね。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。