Java(J2SDK SE) のランタイムライブラリ(rt.jar)をデバッグ変数情報付きにする

Java でデバッガを使ってデバッグしていると、自分で書いたコードから(ステップオーバではなく)ステップインして JavaAPI の中に入ることが良くある。しかし、このとき、どのクラスのどのメソッドを呼んでいるかといったスタック情報は十分見ることができるのだが、API 内部で使っている変数の値がさっぱり分からない(デバッガの変数のウォッチで表示されない)。これは、ランタイムライブラリがデバッグ変数情報なし、でコンパイルされているためだと思われる。すなわち、javac での -g:lines,source は付いているが -g:vars が付いていない。では、付けてみよう。以下、おおまかなやりかた。

  1. C:\j2sdk1.4.2\src.zip を展開する。jar(jar.exe) でも良いが、LHASA など ZIP 用の展開ツールが手っ取り早いだろう。
  2. コンパイルする。思ったほど時間はかからない(でもそれなりにはかかる)。
  3. なぜかエラーが数十個ほど出る。com.sun.corba.se.internal.Interceptors パッケージと com.sun.corba.se.internal.util パッケージと org.apache.xpath.domapi パッケージあたり。
  4. C:\j2sdk1.4.2\jre\lib\rt.jar を書き換えるので、あらかじめファイルのコピーを作っておく(rt2.jar にする)。
  5. jar コマンドで更新する。すなわち「jar uvf0 C:\j2sdk1.4.2\jre\lib\rt2.jar .」とする。なお、非圧縮オプションの 0 はオーじゃなくてゼロなので注意する。これはなくても良いが、もともとの rt.jar は非圧縮らしいのでそれに合わせた。ちなみに 0 を付けずにすなわち圧縮すると、サイズは半分ほどになる。あと、いきなり rt.jar をコピーを作らずに直に jar を使って更新しようとすると、jar 自体が Java のプログラムなので、ファイル共有違反になってしまうぞ。
  6. 最後に rt.jar を削除(や移動・リネーム)して、rt2.jar を rt.jar にリネームする。
  7. Java が動くことと、デバッガで API のクラスの変数がウォッチできることを確かめる。