|
Java Debug Interface | ||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
public interface ThreadReference
ターゲット VM のスレッドオブジェクトです。ThreadReference は、ターゲット VM のスレッド固有の情報に追加アクセスできる ObjectReference
です。
フィールドの概要 | |
---|---|
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 |
フィールドの詳細 |
---|
static final int THREAD_STATUS_UNKNOWN
static final int THREAD_STATUS_ZOMBIE
static final int THREAD_STATUS_RUNNING
static final int THREAD_STATUS_SLEEPING
static final int THREAD_STATUS_MONITOR
static final int THREAD_STATUS_WAIT
static final int THREAD_STATUS_NOT_STARTED
メソッドの詳細 |
---|
String name()
void suspend()
resume()
を使用して再開するか、VirtualMachine.resume()
を使用してほかのスレッドから再開できます。
Thread.suspend()
とは異なり、仮想マシンと個々のスレッド両方の中断がカウントされます。スレッドを再実行する前に、resume()
または resume()
を使って、中断された回数と同じ回数だけ再開してください。
このメソッドを使って単一のスレッドを中断する場合、Thread.suspend()
と同様の危険があります。中断されたスレッドが実行中の別のスレッドに必要なモニターを保持している場合、ターゲット VM でデッドロックが発生する可能性があります (少なくとも、中断されたスレッドが再開されるまでの間)。
中断されたスレッドは、前述の JDI 再開メソッドの 1 つを使って再開されるまで中断状態を維持することが保証されます。 ターゲット VM 内のアプリケーションが、中断したスレッドを java.lang.Thread#resume を使って再開することはできません。
VMCannotBeModifiedException
- VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified()
を参照)。void resume()
suspend()
でも VirtualMachine.suspend()
でもなく、SUSPEND_ALL イベントや SUSPEND_EVENT_THREAD イベントでもない場合、このメソッドを呼び出しても何も起こりません。それ以外の場合、このスレッドについて保留中の中断のカウントが減少します。カウントが 0 まで減少すると、スレッドは実行を継続します。注:中断の原因イベントからスレッドを再開するには、通常、EventSet.resume()
を使用します。
VMCannotBeModifiedException
- VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified()
を参照)。int suspendCount()
suspend()
を参照してください。
void stop(ObjectReference throwable) throws InvalidTypeException
Throwable
オブジェクトを使用してこのスレッドを停止します。
throwable
- スローする非同期の例外。
InvalidTypeException
- throwable
がターゲット VM 内の java.lang.Throwable のインスタンスでない場合。
VMCannotBeModifiedException
- VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified()
を参照)。Thread.stop(Throwable)
void interrupt()
VMCannotBeModifiedException
- VirtualMachine が読み取り専用の場合 (VirtualMachine.canBeModified()
を参照)。Thread.interrupt()
int status()
THREAD_STATUS_UNKNOWN
を返します。スレッドが中断しているかどうかを確認するには、isSuspended()
を使用します。
THREAD_STATUS_UNKNOWN
、THREAD_STATUS_ZOMBIE
、THREAD_STATUS_RUNNING
、THREAD_STATUS_SLEEPING
、THREAD_STATUS_MONITOR
、THREAD_STATUS_WAIT
、または THREAD_STATUS_NOT_STARTED
のいずれかboolean isSuspended()
true
、それ以外の場合は false
。boolean isAtBreakpoint()
true
、それ以外の場合は false
。ThreadGroupReference threadGroup()
ThreadGroupReference
。int frameCount() throws IncompatibleThreadStateException
IncompatibleThreadStateException
- ターゲット VM 内でスレッドが中断されていない場合List<StackFrame> frames() throws IncompatibleThreadStateException
StackFrame
を含む List を返します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。 この情報は、スレッドが再開されると無効になります。
StackFrame
の List。
IncompatibleThreadStateException
- ターゲット VM 内でスレッドが中断されていない場合StackFrame frame(int index) throws IncompatibleThreadStateException
StackFrame
を返します。0 より大きいインデックスの場合は、呼び出し側のフレームを示します。この情報を取得するには、スレッドを中断する必要があります (通常は VM への割り込みによって)。 この情報は、スレッドが再開されると無効になります。
index
- 目的のフレーム
StackFrame
IncompatibleThreadStateException
- ターゲット VM 内でスレッドが中断されていない場合
IndexOutOfBoundsException
- インデックスが frameCount()
以上の場合、または負の場合。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()
List<ObjectReference> ownedMonitors() throws IncompatibleThreadStateException
ObjectReference
を含む List を返します。synchronized 文または synchronized メソッドのエントリを使用してスレッドがモニターに入ってから、Object.wait(long)
によって放棄されていない場合は、そのモニターはスレッドによって所有されています。
この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canGetOwnedMonitorInfo()
を使用します。
ObjectReference
オブジェクトの List。このスレッドによってモニターが所有されていない場合は、このリストの長さはゼロになる
UnsupportedOperationException
- ターゲット Virtual Machine がこの操作をサポートしていない場合。
IncompatibleThreadStateException
- ターゲット VM 内でスレッドが中断されていない場合List<MonitorInfo> ownedMonitorsAndFrames() throws IncompatibleThreadStateException
MonitorInfo
を含む List を返します。synchronized 文または synchronized メソッドのエントリを使用してスレッドがモニターに入ってから、Object.wait(long)
によって放棄されていない場合は、そのモニターはスレッドによって所有されています。
この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canGetMonitorFrameInfo()
を使用します。
MonitorInfo
オブジェクトの List。このスレッドによってモニターが所有されていない場合は、このリストの長さはゼロになる
UnsupportedOperationException
- ターゲット Virtual Machine がこの操作をサポートしていない場合。
IncompatibleThreadStateException
- ターゲット VM 内でスレッドが中断されていない場合ObjectReference currentContendedMonitor() throws IncompatibleThreadStateException
ObjectReference
を返します。スレッドは、synchronized メソッドのエントリ、synchronized 文、または Object.wait(long)
を使用して、モニターを待機している可能性があります。最初の 2 つの場合と最後の 1 つの場合を識別するには、status()
メソッドを使用します。
この操作は、ターゲット仮想マシンでサポートされていないことがあります。この操作がサポートされているかどうかを確認するには、VirtualMachine.canGetCurrentContendedMonitor()
を使用します。
ObjectReference
。スレッドがモニターを待機していない場合は null。
UnsupportedOperationException
- ターゲット Virtual Machine がこの操作をサポートしていない場合。
IncompatibleThreadStateException
- ターゲット VM 内でスレッドが中断されていない場合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()
を参照)。void forceEarlyReturn(Value value) throws InvalidTypeException, ClassNotLoadedException, IncompatibleThreadStateException
早期復帰するメソッドを「被呼び出しメソッド」と呼びます。被呼び出しメソッドは、「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()
を参照)。
|
Java Debug Interface | ||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |