jdb
ユーティリティは、コマンド行デバッガの例としてJDKに含まれています。jdb
ユーティリティは、Java Debug Interface (JDI)を使ってターゲットJVMを起動または接続します。$JAVA_HOME/demo/jpda/examples.jar
にはjdb
のソース・コードが含まれています。
JDIは、(通常はリモートの)仮想マシンの実行状態にアクセスする必要があるデバッガや同様のシステムに役立つ情報を提供する、高レベルのJava APIです。JDIはJava Platform Debugger Architecture (JPDA)のコンポーネントです。「Java Platform Debugger Architecture」を参照してください。
次の項では、jdbユーティリティのトラブルシューティング手法を提供します。
JDIでは、コネクタは、デバッガがターゲットJVMに接続するための手段です。JDKには従来、ターゲットJVMとのデバッグ・セッションを開始して確立するコネクタと、(TCP/IPまたは共有メモリー・トランスポートを使用した)リモート・デバッグに使用されるコネクタが付属しています。
JDKにはさらに、Java言語デバッガからクラッシュ・ダンプやハングアップ・プロセスに接続することを許可する、Serviceability Agent (SA)コネクタもいくつか付属しています。これは、クラッシュまたはハング・アップの際にアプリケーションが何をしていたのかを確認するのに役立つ可能性があります。
これらのコネクタはSACoreAttachingConnector
、SADebugServerAttachingConnector
、およびSAPIDAttachingConnector
です。
これらのコネクタは通常、NetBeans統合開発環境(IDE)や商用IDEなどのエンタープライズ・デバッガで使用されます。次の項では、jdb
コマンド行デバッガでこれらのコネクタを使用する方法を示します。
コネクタの詳細は、JPDAドキュメントの「接続および呼び出しの詳細」を参照してください。
コマンドjdb -listconnectors
は、使用可能なコネクタの一覧を出力します。コマンドjdb -help
は、コマンドの使用方法のヘルプを出力します。
jdb
ユーティリティの詳細は、次のコマンド・マニュアル・ページを参照してください。
例2-13では、SA PID接続コネクタを使用してプロセスに接続します。ターゲット・プロセスは特別なオプションを使用して起動されるわけではありません。つまり、-agentlib:jdwp
オプションは必要ありません。このコネクタがプロセスに接続するときは、読取り専用モードで行われます。つまり、デバッガはスレッドや実行中のアプリケーションを調べることはできますが、何も変更できません。デバッガが接続されている間、プロセスは休止しています。
例2-13のコマンドは、sun.jvm.hotspot.jdi.SAPIDAttachingConnector
という名前のコネクタを使用するようにjdb
に指示しています。これはクラス名ではなくコネクタ名です。コネクタはpid
という引数を1つ取り、その値はターゲット・プロセスのプロセスID (9302
)です。
例2-13 PIDのjdbコネクタ
$jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9302
Initializing jdb ... >threads
Group system: (java.lang.ref.Reference$ReferenceHandler)0xa Reference Handler unknown (java.lang.ref.Finalizer$FinalizerThread)0x9 Finalizer unknown (java.lang.Thread)0x8 Signal Dispatcher running (java.lang.Thread)0x7 Java2D Disposer unknown (java.lang.Thread)0x2 TimerQueue unknown Group main: (java.lang.Thread)0x6 AWT-XAWT running (java.lang.Thread)0x5 AWT-Shutdown unknown (java.awt.EventDispatchThread)0x4 AWT-EventQueue-0 unknown (java.lang.Thread)0x3 DestroyJavaVM running (sun.awt.image.ImageFetcher)0x1 Image Animator 0 sleeping (java.lang.Thread)0x0 Intro running >thread 0x7
Java2D Disposer[1]where
[1] java.lang.Object.wait (native method) [2] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:116) [3] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:132) [4] sun.java2d.Disposer.run (Disposer.java:125) [5] java.lang.Thread.run (Thread.java:619) Java2D Disposer[1]up 1
Java2D Disposer[2]where
[2] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:116) [3] java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:132) [4] sun.java2d.Disposer.run (Disposer.java:125) [5] java.lang.Thread.run (Thread.java:619)
この例では、threads
コマンドを使用してすべてのスレッドの一覧を取得しています。次に、thread 0x7
コマンドで特定のスレッドを選択し、where
コマンドを使ってスレッド・ダンプを取得しています。次に、up 1
コマンドを使用してスタック内で1フレーム上に移動し、where
コマンドを再度使用してスレッド・ダンプを取得しています。
SAコア接続コネクタは、デバッガをコア・ファイルに接続するために使用されます。クラッシュ後にコア・ファイルが作成された可能性があります(「システム・クラッシュのトラブルシューティング」を参照)。コア・ファイルは、gcore
コマンド(Oracle Solarisオペレーティング・システムの場合)、またはgdb
のgcore
コマンド(Linuxの場合)を使用して取得することもできます。コア・ファイルはそのコア・ファイルが作成された時点のプロセスのスナップショットであるため、コネクタは読取り専用モードで接続します。つまり、デバッガはクラッシュ発生時のスレッドや実行中のアプリケーションを調べることができます。
例2-14のコマンドは、sun.jvm.hotspot.jdi.SACoreAttachingConnector
という名前のコネクタを使用するようにjdb
に指示しています。このコネクタはjavaExecutable
、core
という2つの引数を取ります。javaExecutable
引数はJavaバイナリの名前を示します。core
引数は、コア・ファイル名です(例2-14に示すように、PID 20441を持つプロセスからのコア)。
別のマシンからトランスポートされたコア・ファイルをデバッグするには、オペレーティング・システムのバージョンとライブラリが一致する必要があります。この場合はまず、SAデバッグ・サーバーという名前のプロキシ・サーバーを実行できます。その後、デバッガがインストールされたマシン上で、SAデバッグ・サーバー接続コネクタを使ってデバッグ・サーバーに接続できます。
例2-15では、マシン1、マシン2という2つのマシンがあります。マシン1でコア・ファイルが使用可能、マシン2でデバッガが使用可能です。例2-15に示すように、マシン1でSAデバッグ・サーバーが起動されます。
jsadebugd
コマンドは2つの引数を取ります。最初の引数は実行可能ファイルの名前です。通常、これはjava
ですが、別の名前のこともあります(埋込みVMの場合など)。2番目の引数は、コア・ファイルの名前です。この例でのコア・ファイルは、gcore
ユーティリティを使用してPID 20441のプロセスに対して取得されました。
例2-16に示すように、マシン2では、デバッガはSAデバッグ・サーバー接続コネクタを使ってリモートSAデバッグ・サーバーに接続します。
例2-16 リモートSAデバッグ・サーバーへの接続
$ jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=machine1
例2-16のコマンドは、sun.jvm.hotspot.jdi.SADebugServerAttachingConnector
という名前のコネクタを使用するようにjdb
に指示しています。このコネクタは、debugServerName
という引数(SAデバッグ・サーバーが実行されているマシンのホスト名またはIPアドレス)を1つ持ちます。
注: SAデバッグ・サーバーはハングアップ・プロセスのリモート・デバッグにも使用できます。その場合、単一の引数(プロセスのPID)を取ります。さらに、同じマシン上で複数のデバッグ・サーバーを実行する必要がある場合は、それぞれに一意のIDを指定する必要があります。SAデバッグ・サーバー接続コネクタで、このIDは追加のコネクタ引数として提供されます。これらおよび他の関連する詳細は、JPDAのドキュメントを参照してください。 |