Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

Java アプリケーションのデバッグの開始

dbx では、次の種類の Java アプリケーションをデバッグすることができます。

dbx は、これらのどの場合もデバッグ対象が Java アプリケーションであることを認識します。

クラスファイルのデバッグ

次の例に示すように dbx を使用することによって、ファイル名拡張子が .class のファイルをデバッグすることができます。


(dbx) debug myclass.class

アプリケーションを定義しているクラスがパッケージに定義されている場合は、JVM ソフトウェアの制御下でアプリケーションを実行するときと同じで、次の例に示すように、パッケージのパスを指定する必要があります。


(dbx) debug java.pkg.Toy.class

クラスファイルのフルパス名を使用することもできます。この場合、dbx.class ファイル内を調べることによってクラスパスのパッケージ部分を自動的に特定し、フルパス名の残りの部分をクラスパスに追加します。たとえば次のパス名の場合、dbxpkg/Toy.class を主クラス名と判断し、クラスパスに /home/user/java を追加します。


(dbx) debug /home/user/java/pkg/Toy.class

JAR ファイルのデバッグ

Java アプリケーションは、JAR (Java Archive) ファイルにバンドルすることができます。JAR ファイルは、次の例に示すように dbxを使用することによってデバッグすることができます。


(dbx) debug myjar.jar

ファイル名が .jar で終わるファイルのデバッグを開始すると、dbx は、その JAR ファイルのマニフェストに指定されている Main_Class 属性を使って主クラスを特定します (主クラスは、アプリケーションのエントリポイントになっている、JAR ファイル内のクラスです)。フルパス名または相対パス名を使って JAR ファイルが指定された場合、dbxMain-Class 属性のクラスパスの前にそのディレクトリ名を追加します。

Main-Class 属性を持たない JAR ファイルをデバッグする場合、JAR URL 構文 jar:<url>!/{entry} を使用できます。この構文は、次の例のように、主クラスの名前を指定するために JarURLConnection (Java 2 Platform, Standard Edition のクラス) で指定されています。


(dbx) debug jar:myjar.jar!/myclass.class
(dbx) debug jar:/a/b/c/d/e.jar!/x/y/z.class
(dbx) debug jar:file:/a/b/c/d.jar!/myclass.class

これらの例のどの場合も、dbx は次のことを行います。

ラッパーを持つ Java アプリケーションのデバッグ

通常 Java アプリケーションには、環境変数を設定するためのラッパーがあります。Java アプリケーションにラッパーがある場合は、jvm_invocation 環境変数を設定することによって、ラッパースクリプトを使用することを dbx に知らせる必要があります (「JVM ソフトウェアの起動方法のカスタマイズ」を参照)。

動作中の Java アプリケーションへの dbx の接続

dbx を動作中の Java アプリケーションに接続するには、アプリケーションを起動するときに次の例に示すオプションを指定します。アプリケーションが起動すると、動作中のプロセスのプロセス ID を指定して dbx コマンドを実行することによって、デバッグを開始することができます (dbx コマンド」を参照)。


$ java -Djava.compiler=NONE -Xdebug -Xnoagent -Xrundbx_agent myclass.class
$ dbx - 2345

JVM ソフトウェアが libdbx_agent.so を見つけられるようにするには、Java アプリケーションを実行する前に正しいパスを LD_LIBRARY_PATH に追加する必要があります。

installation_directory は Oracle Solaris Studio ソフトウェアがインストールされている場所です。

動作中のアプリケーションに dbx を接続すると、dbx は Java モードでアプリケーションのデバッグを開始します。

Java アプリケーションが 64 ビットのオブジェクトライブラリを必要とする場合は、アプリケーションを起動するときに -d64 オプションを追加してください。この場合、dbx はアプリケーションが動作している 64 ビットの JVM ソフトウェアを使用します。


$ java -Djava.compiler=NONE -Xdebug -Xnoagent -Xrundbx_agent -d64 myclass.class
$ dbx - 2345

Java アプリケーションを埋め込む C/C++ アプリケーションのデバッグ

JNI_CreateJavaVM インタフェースを使って Java アプリケーションを埋め込む C あるいは C++ アプリケーションをデバッグすることができます。この場合、C/C++ アプリケーションは、JVM ソフトウェアに次のオプションを指定することによって Java アプリケーションを起動することができます。


-Xdebug -Xnoagent -Xrundbx_agent

JVM ソフトウェアが libdbx_agent.so を見つけられるようにするには、Java アプリケーションを実行する前に正しいパスを LD_LIBRARY_PATH に追加する必要があります。

installation_directory は Oracle Solaris Studio ソフトウェアがインストールされている場所です。

JVM ソフトウェアへの引数の引き渡し

Java モードで run コマンドを使用した場合、指定した引数は、JVM ソフトウェアではなく、アプリケーションに渡されます。 JVM ソフトウェアに引数を渡す方法については、「JVM ソフトウェアの起動方法のカスタマイズ」を参照してください。

Java ソースファイルの格納場所の指定

Java ソースファイルが、.class.jar ファイルと異なるディレクトリに置かれていることがあります。その場合は、$JAVASRCPATH 環境変数を使って、dbx が Java ソースファイルを探すディレクトリを指定することができます。たとえば、JAVASRCPATH=.:/mydir/mysrc:/mydir/mylibsrc:/mydir/myutils の場合、dbx は指定されたディレクトリで、デバッグ対象のクラスファイルに対応するソースファイルを探します。

C/C++ ソースファイルの格納場所の指定

次の場合は、dbx が C/C++ ソースファイルを見つけられないことがあります。

このような場合、dbx がファイルを見つけられるよう、pathmap コマンドを使ってパス名を別のパス名に対応づけてください (pathmap コマンド」を参照)。

独自のクラスローダーを使用するクラスファイルのパスの指定

通常のクラスパスに含まれてない場所からクラスファイルを読み込む独自のクラスローダーが、アプリケーションに存在することがあります。そのような場合、dbx はクラスファイルを見つけられません。CLASSPATHX 環境変数を使って、独自のクラスローダーが読み込む Java クラスファイルのパスを指定することができます。たとえば、CLASSPATHX=.:/myloader/myclass:/mydir/mycustom の場合、dbx は指定されたディレクトリでクラスファイルを探そうとします。

Java メソッドにブレークポイントを設定する

ネイティブアプリケーションとは異なり、Java アプリケーションには容易にアクセスできる名前のインデックスがありません。そのため、次のように簡単に入力することはできません。


(dbx) stop in myMethod

代わりに、メソッドへのフルパスを使用する必要があります。


(dbx) stop in com.any.library.MyClass.myMethod

例外は、MyClass の何らかのメソッドで停止した場合で、その場合は myMethod で十分です。

フルパスをメソッドに含めることを防ぐ 1 つの方法は、stop inmethod を使用することです。


(dbx) stop inmethod myMethod

しかしそうすると、複数メソッド名 myMethod で停止してしまう場合があります。

ネイティブ (JNI) コードでブレークポイントを設定する

JNI C または C++ コードを含む共有ライブラリは JVM によって動的に読み込まれ、それらにブレークポイントを設定するには、いくつかの追加のステップが必要です。詳しくは、「動的にロードされたライブラリにブレークポイントを設定する」を参照してください。