ひよっこ。

I want to…

Posts Tagged ‘Debug’

Pythonの勉強のためにTracのデバッグ環境を構築する

Posted by hikaruworld : 2009 9月 21

おそらく他人が読んでもわからないでしょう…

と、前置きしつつ。
Pythonの勉強をしたいなぁと常日頃思っていて、
何かいい例がないかなぁと思っていました。

よく考えれば日頃愛用しているtracがpython製だったのを思い出したので、
これを解析しながら勉強して見ようと思い立った次第です。

とりあえず、静的解析は難しいので動的解析をしようと思い、
pyDev上にtracのデバッグ環境を構築した際のメモになります。

前提条件

  • tracdで起動する→standalone.pyを直接起動することにしました
  • trac用に別のPythonをインストール
  • Subversionのインストールは不要

インストール構成は以下の通り。pythonを別にインストールしている。
なおインストール場所は/dev/以下とする。

.
|-- bin					--- スクリプト格納用(trac-adminなど)
|-- data				--- tracプロジェクト
|-- pyDev				--- IDEを利用
|-- python252			--- Python本体。この配下にTracがインストールされる
|   |-- bin
|   `-- lib
|       `-- python2.5
|           `-- site-packages
                `-- Trac-0.11.5-py2.5.egg
`-- workspace			--- pyDevの作業用スペース

tracのインストール

詳しい方法は省きますが、今回は必要最低限のモジュールだけでよいので、
easy_instlalで行い、tracと(その依存関係にある)Genshiをあわせてインストールします。
日本語版を適用するためtracをアンインストールして、trac-jaをインストールします。

その後、tracのsampleプロジェクトを作成します。

注意点

すっかり忘れていたんですが、MacでTrac環境を構築するとX-MAC-JAPANESEという
エンコードをPythonが参照できないLookupErrorが発生します。

基本的にはエラーが発生する箇所のエンコードの設定を修正すればよいんですが(対処療法です)、
この件を忘れていてはまりました。
以前この件ではまったときはtrac/util/datefmt.pyだったように記憶しているのですが、
今回は、trac-adminによるスクリプト実行時でconsole.pyでエラーが発生していました

pyDev上にプロジェクトを作成

個人的には、ここを忘れないようにメモしています。
なお、pyDevのインストールに関しては省略ということで。

環境設定

環境設定→PyDev→インタープリタPythonが/dev/python252/bin/pythonを向いていること。
向いていなければ新規追加する。

Tracプロジェクトの作成

  1. プロジェクト→PyDev
  2. プロジェクト名 — trac
  3. デフォルトのチェックを外す
  4. プロジェクト・コンテンツ — /dev/python252/lib/python2.5/site-package/Trac-0.11.5-py.2.5.egg
  5. 文法バージョン — 2.5
  6. インタープリタ — 上記環境設定で設定したインストールディレクトリ
  7. デフォルト:ソースディレクトリを… — チェックをはずす

[TODO Image]

スタンドアローン起動の設定

Tracは内部にスタンドアローン起動用のサーバを持っているのでそれを利用します。
Tracdを外部からたたく必要があるかと思ったら、いつの間に準備されていてびっくりしました。

  1. trac/util/webへ
  2. standalone.pyを右クリックして「デバッグ」→「python実行」
  3. こんな感じで怒られる。

    pydev debugger: warning: psyco not available for speedups (the debugger will still work correctly, but a bit slower)
    pydev debugger: starting
    Usage: standalone.py [options] [projenv] …

    standalone.py: error: either the –env-parent-dir option or at least one environment must be specified

  4. 右クリック→デバッグ構成を選択
  5. 先ほど実行したstandalone.pyが設定されているはずなので、こいつの設定を修正する
    • 引数(プログラムの引数) — -p 8080 /dev/data/sample
    • インタープリタ(インタープリター) — 環境設定で設定したPython
  6. 起動ログが出力される。

    pydev debugger: warning: psyco not available for speedups (the debugger will still work correctly, but a bit slower)
    pydev debugger: starting
    Server starting in PID 409.
    Serving on 0.0.0.0:8080 view at http://127.0.0.1:8080/

これでデバッグ可能に成ります。

Posted in program | タグ: , , , | Leave a Comment »

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.デバッグを実行

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

Posted in program | タグ: , , | Leave a Comment »