Java Debug Interface

com.sun.jdi
インタフェース ThreadReference

すべてのスーパーインタフェース:
Mirror, ObjectReference, Value

public interface ThreadReference
extends ObjectReference

ターゲット VM のスレッドオブジェクトです。ThreadReference は、ターゲット VM のスレッド固有の情報に追加アクセスできる ObjectReference です。

導入されたバージョン:
1.3

フィールドの概要
static int THREAD_STATUS_MONITOR
          スレッドは Java モニターを待機中です。
static int THREAD_STATUS_NOT_STARTED
          スレッドは開始されていません。
static int THREAD_STATUS_RUNNING
          スレッドは実行可能です。
static int THREAD_STATUS_SLEEPING
          スレッドはスリープ中です。
static int THREAD_STATUS_UNKNOWN
          スレッドの状態が不明です。
static int THREAD_STATUS_WAIT
          Object.wait() または JVM_MonitorWait() が呼び出されました。
static int THREAD_STATUS_ZOMBIE
          スレッドは実行を完了しました。
 
インタフェース com.sun.jdi.ObjectReference から継承されたフィールド
INVOKE_NONVIRTUAL, INVOKE_SINGLE_THREADED
 
メソッドの概要
 ObjectReference currentContendedMonitor()
          このスレッドが現在モニターを待機している場合は、そのモニターの ObjectReference を返します。
 void forceEarlyReturn(Value value)
          return 文に到達する前に強制的にメソッドを復帰させます。
 StackFrame frame(int index)
          スレッドの現在の呼び出しスタック内の指定されたインデックスで StackFrame を返します。
 int frameCount()
          スレッドの現在の呼び出しスタック内のスタックフレーム数を返します。
 List<StackFrame> frames()
          スレッドの現在の呼び出しスタック内にあるすべての StackFrame を含む List を返します。
 List<StackFrame> frames(int start, int length)
          スレッドの現在の呼び出しスタックからの StackFrame ミラーの範囲を含む List を返します。
 void interrupt()
          デバッガによってスレッドが中断されていない場合、このスレッドに割り込みます。
 boolean isAtBreakpoint()
          スレッドがブレークポイントで中断しているかどうかを判定します。
 boolean isSuspended()
          デバッガによってスレッドが中断されているかどうかを判定します。
 String name()
          このスレッドの名前を返します。
 List<ObjectReference> ownedMonitors()
          スレッドが所有する各モニターの ObjectReference を含む List を返します。
 List<MonitorInfo> ownedMonitorsAndFrames()
          スレッドが所有する各モニターの MonitorInfo を含む List を返します。
 void popFrames(StackFrame frame)
          スタックフレームをポップします。
 void resume()
          このスレッドを再開します。
 int status()
          スレッドの状態を返します。
 void stop(ObjectReference throwable)
          非同期の例外を使用してこのスレッドを停止します。
 void suspend()
          このスレッドを中断します。
 int suspendCount()
          このスレッドの保留状態の中断回数を返します。
 ThreadGroupReference threadGroup()
          このスレッドのスレッドグループを返します。
 
インタフェース com.sun.jdi.ObjectReference から継承されたメソッド
disableCollection, enableCollection, entryCount, equals, getValue, getValues, hashCode, invokeMethod, isCollected, owningThread, referenceType, referringObjects, setValue, uniqueID, waitingThreads
 
インタフェース com.sun.jdi.Value から継承されたメソッド
type
 
インタフェース com.sun.jdi.Mirror から継承されたメソッド
toString, virtualMachine
 

フィールドの詳細

THREAD_STATUS_UNKNOWN

static final int THREAD_STATUS_UNKNOWN
スレッドの状態が不明です。

関連項目:
定数フィールド値

THREAD_STATUS_ZOMBIE

static final int THREAD_STATUS_ZOMBIE
スレッドは実行を完了しました。

関連項目:
定数フィールド値

THREAD_STATUS_RUNNING

static final int THREAD_STATUS_RUNNING
スレッドは実行可能です。

関連項目:
定数フィールド値

THREAD_STATUS_SLEEPING

static final int THREAD_STATUS_SLEEPING
スレッドはスリープ中です。Thread.sleep() または JVM_Sleep() が呼び出されました。

関連項目:
定数フィールド値

THREAD_STATUS_MONITOR

static final int THREAD_STATUS_MONITOR
スレッドは Java モニターを待機中です。

関連項目:
定数フィールド値

THREAD_STATUS_WAIT

static final int THREAD_STATUS_WAIT
Object.wait() または JVM_MonitorWait() が呼び出されました。

関連項目:
定数フィールド値

THREAD_STATUS_NOT_STARTED

static final int THREAD_STATUS_NOT_STARTED
スレッドは開始されていません。

関連項目:
定数フィールド値
メソッドの詳細

name

String name()
このスレッドの名前を返します。

戻り値:
スレッド名を含む文字列。

suspend

void suspend()
このスレッドを中断します。スレッドは、resume() を使用して再開するか、VirtualMachine.resume() を使用してほかのスレッドから再開できます。

Thread.suspend() とは異なり、仮想マシンと個々のスレッド両方の中断がカウントされます。スレッドを再実行する前に、resume() または resume() を使って、中断された回数と同じ回数だけ再開してください。

このメソッドを使って単一のスレッドを中断する場合、Thread.suspend() と同様の危険があります。中断されたスレッドが実行中の別のスレッドに必要なモニターを保持している場合、ターゲット VM でデッドロックが発生する可能性があります (少なくとも、中断されたスレッドが再開されるまでの間)。

中断されたスレッドは、前述の JDI 再開メソッドの 1 つを使って再開されるまで中断状態を維持することが保証されます。 ターゲット VM 内のアプリケーションが、中断したスレッドを java.lang.Thread#resume を使って再開することはできません。

例外:
VMCannotBeModifiedException - VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified() を参照)。

resume

void resume()
このスレッドを再開します。このスレッドの中断の原因が、suspend() でも VirtualMachine.suspend() でもなく、SUSPEND_ALL イベントや SUSPEND_EVENT_THREAD イベントでもない場合、このメソッドを呼び出しても何も起こりません。それ以外の場合、このスレッドについて保留中の中断のカウントが減少します。カウントが 0 まで減少すると、スレッドは実行を継続します。注:中断の原因イベントからスレッドを再開するには、通常、EventSet.resume() を使用します。

例外:
VMCannotBeModifiedException - VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified() を参照)。

suspendCount

int suspendCount()
このスレッドの保留状態の中断回数を返します。カウントされる中断については、suspend() を参照してください。

戻り値:
保留状態の中断カウントを表す整数

stop

void stop(ObjectReference throwable)
          throws InvalidTypeException
非同期の例外を使用してこのスレッドを停止します。ターゲット VM 内のデバッガスレッドは、指定された Throwable オブジェクトを使用してこのスレッドを停止します。

パラメータ:
throwable - スローする非同期の例外。
例外:
InvalidTypeException - throwable がターゲット VM 内の java.lang.Throwable のインスタンスでない場合。
VMCannotBeModifiedException - VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified() を参照)。
関連項目:
Thread.stop(Throwable)

interrupt

void interrupt()
デバッガによってスレッドが中断されていない場合、このスレッドに割り込みます。

例外:
VMCannotBeModifiedException - VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified() を参照)。
関連項目:
Thread.interrupt()

status

int status()
スレッドの状態を返します。スレッドが中断していない場合は、スレッドの現在の状態を返します。スレッドが中断している場合は、中断前のスレッドの状態を返します。この情報を取得できない場合は、THREAD_STATUS_UNKNOWN を返します。スレッドが中断しているかどうかを確認するには、isSuspended() を使用します。

戻り値:
THREAD_STATUS_UNKNOWNTHREAD_STATUS_ZOMBIETHREAD_STATUS_RUNNINGTHREAD_STATUS_SLEEPINGTHREAD_STATUS_MONITORTHREAD_STATUS_WAIT、または THREAD_STATUS_NOT_STARTED のいずれか

isSuspended

boolean isSuspended()
デバッガによってスレッドが中断されているかどうかを判定します。

戻り値:
スレッドが現在中断している場合は true、それ以外の場合は false

isAtBreakpoint

boolean isAtBreakpoint()
スレッドがブレークポイントで中断しているかどうかを判定します。

戻り値:
スレッドがブレークポイントで現在停止している場合は true、それ以外の場合は false

threadGroup

ThreadGroupReference threadGroup()
このスレッドのスレッドグループを返します。

戻り値:
ターゲット VM 内のこのスレッドのスレッドグループをミラー化する ThreadGroupReference

frameCount

int frameCount()
               throws IncompatibleThreadStateException
スレッドの現在の呼び出しスタック内のスタックフレーム数を返します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。 この情報は、スレッドが再開されると無効になります。

戻り値:
フレームのカウントを表す整数
例外:
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合

frames

List<StackFrame> frames()
                        throws IncompatibleThreadStateException
スレッドの現在の呼び出しスタック内にあるすべての StackFrame を含む List を返します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。 この情報は、スレッドが再開されると無効になります。

戻り値:
現在のフレームの次に呼び出し側の各フレームが続く StackFrame の List。
例外:
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合

frame

StackFrame frame(int index)
                 throws IncompatibleThreadStateException
スレッドの現在の呼び出しスタック内の指定されたインデックスで StackFrame を返します。0 より大きいインデックスの場合は、呼び出し側のフレームを示します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。 この情報は、スレッドが再開されると無効になります。

パラメータ:
index - 目的のフレーム
戻り値:
要求された StackFrame
例外:
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合
IndexOutOfBoundsException - インデックスが frameCount() 以上の場合、または負の場合。

frames

List<StackFrame> frames(int start,
                        int length)
                        throws IncompatibleThreadStateException
スレッドの現在の呼び出しスタックからの StackFrame ミラーの範囲を含む List を返します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。 この情報は、スレッドが再開されると無効になります。

パラメータ:
start - 取得する最初のフレームのインデックス。 インデックス 0 は現在のフレームを表す。
length - 取得するフレーム数
戻り値:
現在のフレームの次に呼び出し側の各フレームが続く StackFrame の List。
例外:
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合
IndexOutOfBoundsException - 指定された範囲がスタックフレームのインデックスの範囲内にない場合。 つまり、以下のどれかが true である場合に例外がスローされる
    start < 0
    start >= frameCount()
    length < 0
    (start+length) > frameCount()

ownedMonitors

List<ObjectReference> ownedMonitors()
                                    throws IncompatibleThreadStateException
スレッドが所有する各モニターの ObjectReference を含む List を返します。synchronized 文または synchronized メソッドのエントリを使用してスレッドがモニターに入ってから、Object.wait(long) によって放棄されていない場合は、そのモニターはスレッドによって所有されています。

この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canGetOwnedMonitorInfo() を使用します。

戻り値:
ObjectReference オブジェクトの List。このスレッドによってモニターが所有されていない場合は、このリストの長さはゼロになる
例外:
UnsupportedOperationException - ターゲット Virtual Machine がこの操作をサポートしていない場合。
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合

ownedMonitorsAndFrames

List<MonitorInfo> ownedMonitorsAndFrames()
                                         throws IncompatibleThreadStateException
スレッドが所有する各モニターの MonitorInfo を含む List を返します。synchronized 文または synchronized メソッドのエントリを使用してスレッドがモニターに入ってから、Object.wait(long) によって放棄されていない場合は、そのモニターはスレッドによって所有されています。

この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canGetMonitorFrameInfo() を使用します。

戻り値:
MonitorInfo オブジェクトの List。このスレッドによってモニターが所有されていない場合は、このリストの長さはゼロになる
例外:
UnsupportedOperationException - ターゲット Virtual Machine がこの操作をサポートしていない場合。
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合
導入されたバージョン:
1.6

currentContendedMonitor

ObjectReference currentContendedMonitor()
                                        throws IncompatibleThreadStateException
このスレッドが現在モニターを待機している場合は、そのモニターの ObjectReference を返します。スレッドは、synchronized メソッドのエントリ、synchronized 文、または Object.wait(long) を使用して、モニターを待機している可能性があります。最初の 2 つの場合と最後の 1 つの場合を識別するには、status() メソッドを使用します。

この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canGetCurrentContendedMonitor() を使用します。

戻り値:
競合するモニターに対応する ObjectReference。スレッドがモニターを待機していない場合は null。
例外:
UnsupportedOperationException - ターゲット Virtual Machine がこの操作をサポートしていない場合。
IncompatibleThreadStateException - ターゲット VM 内でスレッドが中断されていない場合

popFrames

void popFrames(StackFrame frame)
               throws IncompatibleThreadStateException
スタックフレームをポップします。

パラメータ frame に指定されたフレームとそれまでのすべてのフレームが、スタックからポップされます。frame の 1 つ前のフレームが、現在のフレームになります。

この操作が終了すると、このスレッドは frame を作成したターゲットメソッドの呼び出し命令で中断状態になります。この呼び出し命令に移動すれば、frame のメソッドを再実行することができます。

オペランドスタックは復元されますが、前回のメソッド呼び出し時に実行された引数に対する変更は取り消されません。たとえば、次のような foo メソッドを考えます。

    void foo(int x) {
        System.out.println("Foo: " + x);
        x = 4;
        System.out.println("pop here");
    }
 
このメソッドを foo(7) として呼び出したあと、foo を 2 番目の println の位置でポップして再開した場合、「Foo: 4」と出力されます。 

ポップされたフレームに対するロックは、ポップ時に解放されます。これは、ポップされた同期化メソッドや、その中の同期化ブロックにも当てはまります。

最終的に、ブロックは実行されません。

このメソッド呼び出しによって、このスレッドの実行ポイントとロック以外の状態が変わることはありません。具体的には、フィールドの値や I/O ストリームなどの外部リソースの状態が変わることはありません。ただし、ターゲットプログラムの状態が、通常のプログラムフローではあり得ない状態になる場合があります。 たとえば、ロックの取得順序に混乱をきたすことが考えられます。このため、ターゲットプログラムが予期しない動作をする可能性があります。

指定されるスレッドは、中断されている必要があります。

このスレッドの StackFrames はすべて無効です。

このメソッドによって生成されるイベントはありません。

frame の呼び出し側のフレームとそれまでのフレームはどれも、ネイティブであってはいけません。

この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canPopFrames() を使用します。

パラメータ:
frame - ポップするスタックフレーム。frame はこのスレッドの呼び出しスタック上に存在する必要がある。
例外:
UnsupportedOperationException - ターゲット仮想マシンでこの操作がサポートされていない場合。canPopFrames() を参照。
IncompatibleThreadStateException - このスレッドが中断されていない場合。
IllegalArgumentException - frame がこのスレッドの呼び出しスタック上に存在しない場合。
NativeMethodException - ポップされたフレームの中にネイティブメソッドのフレームが存在する場合、または frame の 1 つ前のフレームがネイティブである場合。
InvalidStackFrameException - この frame が無効になっている場合。 このスレッドがいったん再開されると、そのスタックフレームは有効でなくなる。 フレームがこれ以上存在しない場合はこの例外もスローされる
VMCannotBeModifiedException - VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified() を参照)。
導入されたバージョン:
1.4

forceEarlyReturn

void forceEarlyReturn(Value value)
                      throws InvalidTypeException,
                             ClassNotLoadedException,
                             IncompatibleThreadStateException
return 文に到達する前に強制的にメソッドを復帰させます。 

早期復帰するメソッドを「被呼び出しメソッド」と呼びます。被呼び出しメソッドは、「Java 仮想マシン仕様」の「Frames」のセクションに定義されているとおり、このメソッドの呼び出し時に、指定されたスレッドの現在のメソッドになります。 

スレッドは中断される必要があります。 メソッドの復帰は、Java プログラミング言語のコードの実行がこのスレッド上で再開されたときに行われます。このメソッドを呼び出してからスレッドの実行が再開される前の間のスタックの状態は未定義です。

被呼び出しメソッドでは、これ以上の命令は実行されません。特に、最終的にブロックは実行されません。注: これにより、アプリケーション内で整合性のない状態が発生することがあります。

被呼び出しメソッドを呼び出すことによって獲得されたロック (これが synchronized メソッドの場合) と、被呼び出しメソッド内の synchronized ブロックに入ることによって獲得されたロックは解除されます。注:これは、ネイティブロックや java.util.concurrent.locks ロックには適用されません。 

通常復帰の場合と同様に、MethodExit などのイベントが生成されます。 

被呼び出しメソッドは、非ネイティブの Java プログラミング言語のメソッドとします。スタック上にフレームが 1 つだけある状態でスレッドへの強制復帰を行なった場合、スレッドが再開時に終了します。 

引数 value には、メソッドが復帰する値を指定します。メソッドの戻り値の型が void である場合は、この値を VoidValue にします。 オブジェクトの値は、このメソッドの戻り値の型への代入互換性を持たなければいけません。これは、このメソッドの戻り値の型を、囲むクラスのクラスローダーによってロードする必要があることを意味します。 プリミティブ値は、このメソッドの戻り値の型への代入互換性を持たなければいけません。つまり、情報を失わずにこの変数型に変換できる必要があります。 代入互換性の詳細は、「Java 言語仕様」のセクション 5.2 を参照してください。

この操作は、ターゲット仮想マシンでサポートされていないことがあります。 この操作がサポートされているかどうかを確認するには、VirtualMachine.canForceEarlyReturn() を使用します。

パラメータ:
value - メソッドが復帰する値。
例外:
UnsupportedOperationException - ターゲット仮想マシンでこの操作がサポートされていない場合。canForceEarlyReturn() を参照
IncompatibleThreadStateException - このスレッドが中断されていない場合。
NativeMethodException - 復帰フレームがネイティブメソッドのフレームである場合。
InvalidStackFrameException - フレームが存在しない場合。
InvalidTypeException - 値の型がメソッドの戻り値の型に一致しない場合。
ClassNotLoadedException - メソッドの戻り値の型が適切なクラスローダーによってロードされていない場合。
VMCannotBeModifiedException - VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified() を参照)。
導入されたバージョン:
1.6

Java Debug Interface