Java Platform, Standard Editionトラブルシューティング・ガイド
目次      

2.11 jdbユーティリティ

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ユーティリティのトラブルシューティング手法を提供します。

2.11.1 jdbユーティリティによるトラブルシューティング

JDIでは、コネクタは、デバッガがターゲットJVMに接続するための手段です。 JDKには従来、ターゲットJVMとのデバッグ・セッションを開始して確立するコネクタと、(TCP/IPまたは共有メモリー・トランスポートを使用した)リモート・デバッグに使用されるコネクタが付属しています。

JDKにはさらに、Java言語デバッガからクラッシュ・ダンプやハングアップ・プロセスに接続することを許可する、Serviceability Agent (SA)コネクタもいくつか付属しています。 これは、クラッシュまたはハング・アップの際にアプリケーションが何をしていたのかを確認するのに役立つ可能性があります。

これらのコネクタはSACoreAttachingConnectorSADebugServerAttachingConnector、およびSAPIDAttachingConnectorです。

これらのコネクタは通常、NetBeans統合開発環境(IDE)や商用IDEなどのエンタープライズ・デバッガで使用されます。 次の項では、jdbコマンド行デバッガでこれらのコネクタを使用する方法を示します。

コネクタの詳細は、JPDAドキュメント「接続および呼び出しの詳細」を参照してください。

コマンドjdb -listconnectorsは、使用可能なコネクタの一覧を出力します。 コマンドjdb -helpは、コマンドの使用方法のヘルプを出力します。

jdbユーティリティの詳細は、次のコマンド・マニュアル・ページを参照してください。

2.11.2 プロセスの接続

例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コマンドを再度使用してスレッド・ダンプを取得しています。

2.11.3 同一マシン上のコア・ファイルへの接続

SAコア接続コネクタは、デバッガをコア・ファイルに接続するために使用されます。 クラッシュ後にコア・ファイルが作成された可能性があります(「システム・クラッシュのトラブルシューティング」を参照)。 コア・ファイルは、gcoreコマンド(Oracle Solarisオペレーティング・システムの場合)、またはgdbgcoreコマンド(Linuxの場合)を使用して取得することもできます。 コア・ファイルはそのコア・ファイルが作成された時点のプロセスのスナップショットであるため、コネクタは読取り専用モードで接続します。つまり、デバッガはクラッシュ発生時のスレッドや実行中のアプリケーションを調べることができます。

例2-14のコマンドは、sun.jvm.hotspot.jdi.SACoreAttachingConnectorという名前のコネクタを使用するようにjdbに指示しています。 このコネクタはjavaExecutablecoreという2つの引数を取ります。 javaExecutable引数はJavaバイナリの名前を示します。 core引数は、コア・ファイル名です(例2-14に示すように、PID 20441を持つプロセスからのコア)。

例2-14 jdbコネクタ


$ jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:javaExecutable=$JAVA_HOME/bin/java,core=core.20441

2.11.4 別のマシンからのコア・ファイルまたはハング・プロセスへの接続

別のマシンからトランスポートされたコア・ファイルをデバッグするには、オペレーティング・システムのバージョンとライブラリが一致する必要があります。 この場合はまず、SAデバッグ・サーバーという名前のプロキシ・サーバーを実行できます。 その後、デバッガがインストールされたマシン上で、SAデバッグ・サーバー接続コネクタを使ってデバッグ・サーバーに接続できます。

例2-15では、マシン1、マシン2という2つのマシンがあります。 マシン1でコア・ファイルが使用可能、マシン2でデバッガが使用可能です。 例2-15に示すように、マシン1でSAデバッグ・サーバーが起動されます。

例2-15 SAデバッグ・サーバーの起動

$ jsadebugd $JAVA_HOME/bin/java core.20441

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のドキュメントを参照してください。

目次      

Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved.