JavaTM 2 SDK, v1.4 での JPDA の拡張機能 |
JPDA ガイドに戻る |
バージョン 1.4 の Java 2 SDK では、次の JPDA の機能が追加されています。フルスピードでのデバッグ
HotSwap クラスファイルの置換を可能にする
インスタンス フィルタ
他の言語のデバッグをサポート
VMDeathRequests
フルスピードでのデバッグ
Java HotSpot[TM] 仮想マシンは、「フルスピードでのデバッグ」を行います。 旧バージョンの HotSpot では、デバッグが有効にされている場合、プログラムはインタプリタのみを使用して実行していました。 このバージョンでは、HotSpot テクノロジのパフォーマンス面の利点を、デバッグが有効な状態で動作しているプログラムにおいて活かすことができます。 パフォーマンスが向上すると、長時間動作するプログラムをより簡単にデバッグできるようになります。 また、テストをフルスピードで実行し、例外に対しデバッグを起動できます。HotSwap クラスファイルの置換を可能にする-Xrunjdwp:transport=dt_socket,server=y,onuncaught=y,launch=myDebuggerLaunchScript「onthrow」および「onuncaught」の起動の詳細については、「接続および呼び出しの詳細」を参照してください。 ブレークポイントを設定して禁止できるのは、ブレークポイントを含むメソッドのコンパイル (フルスピード実行) のみです。 シングルステッピングのようなデバッグ処理中、および「メソッドに入る」または「メソッドから出る」、あるいはウォッチポイントが設定されているとき、実行はインタプリタに戻ります。現在、フルスピードデバッグを利用できるのは、クライアント (デフォルト) コンパイラだけです。
インスタンスフィルタこの新機能は、動作中のアプリケーションの修正したコードをデバッガの API を介して置き換える機能をカプセル化します。 たとえば、1 つのクラスをコンパイルし直して、古いインスタンスを新しいインスタンスに置き換えることができます。
この変更は、次の課題に対応することを目的としています。
- Tool (IDE) ベンダーが望む、修正継続 (fix-and-continue) 方式のデバッグ機能。 つまり、デバッグによって問題を識別した後、その問題を修正し、修正されたコードのデバッグを続行する
- 長時間動作するサーバを展開している組織では、サーバをダウンさせずにバグを修正することが望まれる
この HotSwap 機能により、JavaTM Platform Debugger Architecture (JPDA) では、デバッガの制御のもとにクラスを更新できるようになります。 この機能で中心的な役割を果たす 2 つのコンポーネントは、RedefineClasses と PopFrame です。RedefineClasses はクラス定義を置き換え、PopFrame は定義し直されたメソッドの再実行を可能にするためのスタックフレームをポップします。
リファレンス実装では、この機能は、Java Virtual Machine Debug Interface (JVMDI) 層で実装されており、JPDA の上位層である Java Debug Wire Protocol (JDWP) および Java Debug Interface (JDI) を介して利用できます。
再定義機能
JDI VirtualMachine.redefineClasses(Map classToBytes) JDWP RedefineClasses (Cmd 18) in VirtualMachine (CmdSet 1) JVMDI RedefineClasses(jint classCount, JVMDI_class_definition *classDefs) Pop Frame 機能
JDI ThreadReference.popFrames(StackFrame frame) JDWP PopFrames (Cmd 4) in StackFrame (CmdSet 16) JVMDI PopFrame(jthread thread) 各層のすべての機能は、それぞれ独立したオプションになっています。 GetCapabilities 機能 (JVMDI 層)、 CapabilitiesNew コマンド (JDWP 層)、 canRedefineClasses、 canAddMethod、 canUnrestrictedlyRedefineClasses、 canPopFrames の各メソッド (JDI 層) は、どの機能が実装されているかを記述します。
この変更に関するバグ報告については、4287595 を参照してください。
他の言語のデバッグをサポートBreakpointRequest、MethodExitRequest、ExceptionRequest、StepRequest、WatchpointRequest、および MethodEntryRequest の各クラスに、
addInstanceFilter
メソッドを使ってインスタンスフィルタを追加する機能が用意されました。 インスタンスフィルタは、要求によって生成されるイベントを、現在実行中のインスタンスが指定されたオブジェクトであるイベントだけに制限します。Java プログラミング言語ソースに翻訳されている Java 以外のプログラミング言語を後でデバッグできるようにするため、Java Platform Debugger Architecture の拡張が行われています。 次の表は、新しい API と、コメントが変更された API をまとめたものです。 この情報は SourceDebugExtension に基づいています。VMDeathRequests
VMDeathRequest クラスを使うと、ターゲット VM が終了したときに通知するよう要求できます。 使用可能な VMDeathRequest の条件が満たされると、VMDeathEvent
を含むEventSet
がEventQueue
に置かれます。VMDeathRequest を作成しない場合でも、1 つの要求されていない VMDeathEvent が、
SUSPEND_NONE
という中断ポリシー
とともに送られます。 通常、この要求は、SUSPEND_ALL
という中断ポリシーとともに VMDeathEvent を送るために作成されます。 このイベントは、VM が稼動していることが必要な処理 (たとえば、イベント処理) の完了を確認するために利用できます。 注: その場合も、要求されていない VMDeathEvent は送られます。
Copyright © 2001 Sun Microsystems, Inc. All Rights Reserved. コメントの送付先: java-debugger@java.sun.com |