デバッグ用コード切り替えスイッチ
プログラムの内部動作というのは,なかなか表向きからはわからない。原因不明のバグも1,2件はめずらしくない。開発途中であれば,開発者が内部の動作状況をトレースするためのコードを埋め込んで検証したりすることは容易だが,一旦リリースしてしまった後となると検証を行うことは非常に難しくなる。リリース時にデバッグ用コードをプログラムから削除してしまうことが多いからだ。
J2SEの1.4から追加されたアサーション機構は,VMの起動時にそれを有効にするかどうかを切り替えられる。それと同じように,プラグインを試験するためのRun-time Workbenchでは,トレース機能などのデバッグ用コードを有効にするかどうかを切り替えるための機構が備わっている。
Eclipseを構成するプラグインをいろいろ覗いていくと,.optionsという名前のファイルを持っているのがわかる。この.optionsファイルには,各機能を有効にするかどうかのスイッチとなる名前と,有効にするかどうかの真偽値(trueかfalse)を記述する。スイッチの名前は,プラグインのIDに機能名を加えたものである。
# Turn on debugging for the yoichiro.myPlugin
yoichiro.myPlugin/debug=true
# Displays file name.
yoichiro.myPlugin/display/filename=false
先頭が「#」の行はコメントとみなされる。上記を見てわかるように,プラグインIDのあとは「/」で機能名を区切って記述する。機能名は任意に決めてよい。プロパティファイルと同じように,trueかfalseかの値を「=」のあとに記述する。
プログラムから上記のファイルにアクセスするために,PlatformクラスのgetDebugOptionメソッドを使用する。一般的には,クラスのstaticイニシャライザで値を読み込んで,実際のコード中で使用する。
public class Hoge {
private static boolean debug = false;
static {
String value = Platform.getDebugOption(
"yoichiro.myPlugin/debug");
if (value != null && value.equalsIgnoreCase("true")) {
Hoge.debug= = true;
}
}
}
PlatfromクラスのgetDebugOptionメソッドに.optionsファイルに記載した「プラグインID+機能名」の文字列を渡すことで,その値を文字列として取得することができる。そして,文字列がnull(指定された項目が見つからない)ではなく,しかも値がtrueだった場合は,debugフィールドの値を真としている。あとはdebugフィールドの値を使って,
if (Hoge.debug)
System.out.println("Debug: ...");
というようにしてデバッグコードを記載すればよい。
次に.optionsファイルに記載された項目のON/OFFを切り替える方法だが,もちろん.optionsファイルを直接書き換えてtrue/falseを切り替えてもよい。しかし,Eclipseではプラグインを試験するためのRun-time Workbench実行では,この.optionsファイルに記載された値をGUIを用いて変更することができる。
[Run]-[Run...]メニューで表示される設定画面のRun-time Workbench項目の中には,Tracingという項目がある。Enable tracingチェックボックスにチェックを入れ,プラグインを選択すると,そのプラグインの.optionsファイルに記載された項目が表示される。そのValue列をクリックして,true/falseを切り替えることができ,Run-time Workbenchの実行時にtrueにした項目が有効になる。
さて,上記の機構は基本的にはRun-time Workbenchによる実行時の話であるが,一旦プラグインがリリースされればRun-time Workbenchによる実行ではなく,通常のEclipseの起動によってプラグインが組み込まれる。通常の起動では,.optionsファイルが読み込まれることはなく,一般的にデバッグ機能は有効にならない。しかし,以下のようにEclipseの起動時にオプションを記述すれば.optionsファイルを読み込ませることができ,.optionsファイル中のtrueの項目に関して,デバッグ機能を有効にすることができる。
eclipse.exe -debug C:\eclipse\plugins\yoichiro.myPlugin\.options
プラグインのリリース後に問題が発生した場合は,上記のコマンドでユーザに起動してもらい,デバッグ情報を採取すると良いだろう。
| 固定リンク
この記事へのコメントは終了しました。
コメント
static イニシャライザでフィールド値を変更するのではなく、final宣言とともに使用したほうが良いのでは?static final でないと、処理速度に影響がでるのではなかったでしたっけ?以下はorg.eclipse.jdt.internal.ui.javaeditor.ASTProviderクラスのフィールド値の例↓ともかくとても有益な情報をありがとうございます!
private static final boolean DEBUG= "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.jdt.ui/debug/ASTProvider"));
投稿: しん | 2005.02.16 07:41 午後