oldjdb - 旧バージョンの Java デバッガ

oldjdb は、Java 言語プログラムのバグを見つけて修正するために使用するツールです。

形式

oldjdb [ options ] [ class ] [ arguments ] 
options
次に示すコマンド行オプション
class
デバッグを開始するクラスの名前
arguments
class の main() メソッドに渡す引数

解説

oldjdb は旧バージョンの Java デバッガですが、以前のバージョンの Java 2 SDK で提供されている jdb ツールと完全な互換性があります。 新しいバージョンの jdb は oldjdb より信頼性が高いため、新しいバージョンを使用することを強くお勧めします。 oldjdb ツールは、Java クラス用の、dbx に似たコマンド行デバッガです。 sun.tools.debug API を使用して、ローカルまたはリモート Java インタプリタの検査とデバッグを行います。

oldjdb ツールは、従来の VM 環境で動作するアプリケーションだけをデバッグします。

oldjdb セッションの開始

dbx と同様に、oldjdb をデバックに使用するための方法は 2 つあります。 もっとも多く使われるのは、デバッグするクラスを指定して、oldjdb に Java インタプリタを起動させる方法です。 コマンド行で、java の代わりに oldjdb コマンドを入力します。 たとえば、oldjdb のもとでアプレットビューアを起動するには、次のようにします。
C:\> oldjdb sun.applet.AppletViewer
または
C:\> oldjdb -classpath %INSTALL_DIR%\classes sun.applet.AppletViewer
この方法で起動すると、oldjdb は、指定されたパラメータを使って 2 つ目の Java インタプリタを呼び出します。 次に、指定されたクラスをロードして、クラスの最初の命令を実行する前にインタプリタを停止させます。

oldjdb のもう 1 つの使用方法は、すでに起動している Java インタプリタに jdb を接続することです。 セキュリティ上の理由で、Java インタプリタは、-Xdebug オプションで開始したときだけデバッグされます。 -Xdebug オプションで開始した場合、Java インタプリタは oldjdb が使用するパスワードを表示します。 また、デバッグされるインタプリタは、JIT コンパイラとともに実行してはなりません。 JIT コンパイラをロードしないようにするには、-Djava.compiler=NONE オプションを使います。 デバッグされるインタプリタが、特別なデバッガクラスを利用できるようにする必要があります。 これらのクラスは、デフォルトのランタイムクラスライブラリには含まれていません。 オプション -Xbootclasspath:%INSTALL_DIR%\jre\lib\rt.jar;%INSTALL_DIR%\lib\tools.jar を使って、デバッグするインタプリタが必要なすべてのクラスを検索できるようにします。 つまり、次のようにして Java インタプリタを起動します。

   % java -classic -Xdebug -Djava.compiler=NONE   \
     -Xbootclasspath:%INSTALL_DIR%\jre\lib\rt.jar;%INSTALL_DIR%\lib\tools.jar <class>

起動している Java インタプリタに oldjdb を接続するには (セッションパスワードがわかっている場合)、次のようにして呼び出します。

C:\> oldjdb -host <hostname> -password <password>

oldjdb の基本コマンド

基本的な oldjdb コマンドの一覧を示します。 Java デバッガがサポートするコマンドはこれ以外にもあり、それらは oldjdb の help コマンドを使用して表示することができます。

注: 局所 (スタック) 変数をブラウズするには、クラスが -g オプションでコンパイルされていなければなりません。

help または ?
もっとも重要な oldjdb コマンド help は、認識されたコマンドのリストに簡潔な説明を付けて表示します。
print
Java オブジェクトをブラウズします。 print コマンドはオブジェクトの toString() メソッドを呼び出しますが、そのフォーマットはクラスにより異なります。

クラスは、オブジェクト ID または名前によって指定します。 クラスがすでにロードされている場合、java.lang.Thread の Thread のような部分文字列を使用できます。

print は、print MyClass.clsVar のような Java の式をサポートします。 メソッドの呼び出しは、現在はサポートされていません。

dump
オブジェクトのインスタンス変数をダンプします。 オブジェクトはオブジェクト ID (16 進数整数) によって指定されます。

クラスは、オブジェクト ID または名前によって指定します。 クラスがすでにロードされている場合は、java.lang.Thread の Thread のような部分文字列を使用できます。クラスがロードされていない場合は、完全な名前で指定する必要があり、クラスは副作用としてロードされます。 これは、アプレットを実行する前に、参照されるクラスにブレークポイントを設定するために必要です。

dump コマンドは、dump 0x12345678.myCache[3].foo のような Java の式をサポートします。 メソッドの呼び出しは、現在はサポートされていません。

threads
スレッドを一覧表示します。 スレッドはオブジェクト ID により参照されます。

where
引数を持たない where コマンドは、(threads コマンドで設定された) 現在のスレッドのスタックをダンプします。where all コマンドは、現在のスレッドグループにあるスレッドのスタックを、すべてダンプします。 where threadid は、指定スレッドのスタックをダンプします。 threadid は t@3 のように、t@<index> の形式をとります。 要求されたスレッドが (ブレークポイントか suspend コマンドによって) 中断している場合は、局所 (スタック) 変数とインスタンス変数は print コマンドと dump コマンドでブラウズできます。 up コマンドと down コマンドで、どのスタックフレームをカレントにするかを選ぶことができます。

ブレークポイント

ブレークポイントは、「stop at MyClass:45」などとして、oldjdb でクラスに設定されます。 ソースファイルの行番号、またはメソッドの名前で指定しなければなりません (ブレークポイントはそのメソッドの最初の命令に設定される)。 clear コマンドは、clear MyClass:45 のような構文を使用してブレークポイントを削除します。 引数を付けないで clear コマンドを使用すると、現在設定されているすべてのブレークポイントが一覧表示されます。 cont コマンドは実行を継続します。 ステップ実行は、step コマンドを使用すると利用できます。

例外

Java プログラムのスタック上のどこにも catch 文がない場合に例外が発生すると、Java Runtime は通常、例外トレースをダンプして終了します。 しかし、oldjdb のもとで実行すると、例外は回復不能なブレークポイントとして取り扱われ、oldjdb は問題のある命令で停止します。 そのクラスが -g オプションでコンパイルされた場合、例外の原因を判定できるように、インスタンス変数と局所変数が表示されます。

特定の例外は、catch コマンドでキャッチすることができます。 たとえば、「catch FileNotFoundException」または「catch mypackage.BigTroubleException」のようにします。Java デバック機能によってこれらの例外のリストが保持され、そのどれかがスローされると、例外を発生させた命令にブレークポイントが設定されていたかのように処理されます。 ignore コマンドは、このリストから例外クラスを取り除きます。

注: ignore コマンドでは、Java インタプリタは例外を無視せず、デバッガだけが例外を無視します。

オプション

コマンド行で Java インタプリタの代わりに oldjdb を使用する場合、oldjdb は、java コマンドと同じオプションを受け入れます。

oldjdb を使用して、実行中の Java インタプリタセッションに接続する場合、oldjdb は次のオプションを受け入れます。

-host <hostname>
接続するインタプリタセッションを実行する、ホストマシンの名前を指定します。
-password <password>
アクティブなインタプリタセッションに「ログイン」します。 これは、-Xdebug オプションで呼び出したとき、Java インタプリタによって表示されるパスワードです。

環境変数

CLASSPATH
ユーザ定義クラスへのパスをシステムに指定します。 ディレクトリはセミコロンで分割されています。 次に例を示します。
    .;C:\users\dac\classes;C:\tools\java\classes

関連項目

javac、java、javah、javap、javadoc