jdb-rw(逆向きウォッチポイント対応JDB)
Last modified: 2003/08/21 15:12:58
English is here.
概要
逆向きウォッチポイント(reverse watchpoint)機能を実装したJDB。現行の機能はgcc-pg2のgdb-wrapper.plとほぼ同等だが、jumpのときに不要な再実行を行わないことと、revwatch実行時の取得情報をキャッシュするため、より効率良く動作する(ただし、jdbを終了するとキャッシュした情報は失われる)。
必要なシステム
- J2SE-1.4以降(動作確認はRedHat Linux 7.2 + J2SE-1.4.2で行った)
起動の仕方
- BCELをダウンロードする(2003年8月現在の最新版はv5.1/bcel-5.1.tar.gz)。
- jdb-rw.jar(約150kB)をダウンロードする。
- デバッグ対象プログラム(デバッギ)を変換してタイムスタンプ機構を組み込む(tools.jarのパスは適宜読みかえて下さい)。
java -classpath jdb-rw.jar:bcel-5.1.jar:/usr/java/j2sdk1.4.2/lib/tools.jar Convert debuggee.class
- jdb-rwを起動する(classpathではjdb-rw.jarが先になることに注意)。
java -classpath jdb-rw.jar:/usr/java/j2sdk1.4.2/lib/tools.jar com.sun.tools.example.debug.tty.TTY debuggee args...
jdb-rwのコマンド
- mark
- ポジションを記録する。引数なしで、記録したポジションの一覧を表示。
mark [<timestamp> [<ClassID:LineNum>]]
- unmark
- 記録したポジションを削除する。引数はポジション番号。
unmark [<PosNum>]
- jump
- 記録したポジションに制御を移動する。移動先が現在より過去の場合、デバッギを再起動する。引数はポジション番号。
jump [<PosNum>]
- revwatch
- コマンドを指定したときのポジションから見て、最後に対象の変数へ代入したポジションに制御を移動する。引数は通常のwatchと同じ。
revwatch <ClassID.FieldName>
既知の不具合
- jumpコマンド実行後、printコマンドが「処理中に内部例外が発生しました」と報告することがある。
→ 少し待って繰返しコマンドを入力すれば回復する。
- revwatchの監視対象をインスタンスごとに設定できない。
→ JDBそのものが対応していない。J2SE-1.4.1でJPDAに追加されたInstance Filtersで解決可能。
- mark, jump, revwatchはデバッギに再現性がある場合にのみ意味を持つので、マルチスレッドJavaプログラムでは正常に動作しない。
→ マルチスレッドの記録・再現機能をつける予定。
今後の予定
- マルチスレッドJavaプログラムの記録と再現の機能の付与。
Kazutaka Maruyama <kazutaka_(!!at-mark!!)_sanpo-lab.jp>(SPAM対策)