线程调用堆栈上一个方法调用的状态。当线程执行时,堆栈帧会随着方法的调用而从其调用堆栈中被压入和弹出,然后返回。 StackFrame 在其线程执行的某个时刻从目标 VM 镜像一个这样的帧。那么,调用堆栈只是一个 StackFrame 对象列表。通过调用
ThreadReference.frames() 可以在线程挂起时随时获取调用堆栈
StackFrames 提供对方法的局部变量及其当前值的访问。
StackFrame 的生命周期非常有限。它仅对挂起的线程可用,并且一旦其线程恢复就失效。
如果目标 VM 已断开连接并且 VMDisconnectEvent 已经或可从 EventQueue 读取,则 StackFrame 上以 StackFrame 作为参数的任何方法都可能抛出 VMDisconnectedException 。
如果目标 VM 内存不足,StackFrame 上以 StackFrame 作为参数的任何方法都可能抛出 VMOutOfMemoryException 。
- 自从:
- 1.3
-
方法总结
修饰符和类型方法描述返回此帧中所有参数的值。getValue(LocalVariable variable) 在此帧中获取LocalVariable的Value。getValues(List<? extends LocalVariable> variables) 返回此帧中多个局部变量的值。location()返回帧中当前指令的Location。voidsetValue(LocalVariable variable, Value value) 在此帧中设置LocalVariable的Value。返回当前帧的“this”值。thread()返回运行此框架方法的线程。visibleVariableByName(String name) 查找与给定名称匹配且在当前帧位置可见的LocalVariable。返回一个列表,其中包含可以从此框架的位置访问的每个LocalVariable。在接口 com.sun.jdi.Mirror 中声明的方法
toString, virtualMachine
-
方法详情
-
location
Location location()返回帧中当前指令的Location。创建此框架的方法也可以通过返回的位置访问。对于堆栈中的顶部帧,此位置标识要执行的下一条指令。对于所有其他帧,此位置标识导致调用下一帧方法的指令。如果框架表示本地方法调用,则返回的位置指示类和方法,但代码索引将无效 (-1)。- 指定者:
location在接口Locatable中- 返回:
-
当前指令的
Location。 - 抛出:
InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。
-
thread
ThreadReference thread()返回运行此框架方法的线程。- 返回:
-
a
ThreadReference镜像框架的线程。 - 抛出:
InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。
-
thisObject
ObjectReference thisObject()返回当前帧的“this”值。 'this' 的ObjectReference仅适用于非本机实例方法。- 返回:
-
一个
ObjectReference,如果框架表示本机或静态方法,则为 null。 - 抛出:
InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。
-
visibleVariables
返回一个列表,其中包含可以从此框架的位置访问的每个LocalVariable。可见性基于此 StackFrame 的当前指令的代码索引。每个变量都有一个字节码索引范围,可以在其中访问它。如果这个栈帧的方法匹配这个变量的方法,并且如果这个栈帧的代码索引在变量的字节码范围内,那么这个变量是可见的。
变量的字节码范围至少与该变量的范围一样大,但在某些情况下可以继续超出范围的末尾:
- 编译器/VM 不会立即重用变量的槽。
- 实现编译器/VM 以报告上述项目产生的扩展范围。
- 返回:
-
当前可见的
LocalVariable对象列表;如果没有可见变量,列表将为空;具体来说,本地方法中的框架将始终返回一个零长度列表。 - 抛出:
AbsentInformationException- 如果此方法没有局部变量信息。InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。NativeMethodException- 如果当前方法是原生的。
-
visibleVariableByName
查找与给定名称匹配且在当前帧位置可见的LocalVariable。有关可见性的更多信息,请参见visibleVariables()。- 参数:
name- 要查找的变量名- 返回:
-
匹配的
LocalVariable,如果没有具有给定名称的可见变量,则为 null ;本机方法中的框架将始终返回 null。 - 抛出:
AbsentInformationException- 如果此方法没有局部变量信息。InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。NativeMethodException- 如果当前方法是原生的。
-
getValue
- 参数:
variable- 要访问的LocalVariable- 返回:
-
实例字段的
Value。 - 抛出:
IllegalArgumentException- 如果变量对该框架的方法无效或不可见。InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。
-
getValues
返回此帧中多个局部变量的值。根据visibleVariables()中描述的规则,每个变量必须对该框架的方法有效并且可见。- 参数:
variables- 要访问的LocalVariable对象的列表- 返回:
-
将每个
LocalVariable与其Value相关联的map - 抛出:
IllegalArgumentException- 如果任何变量对该框架的方法无效或不可见。InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。
-
setValue
void setValue(LocalVariable variable, Value value) throws InvalidTypeException , ClassNotLoadedException 在此帧中设置LocalVariable的Value。根据visibleVariables()中描述的规则,该变量必须对该框架的方法有效并且可见。在虚拟线程的情况下,当此帧是最顶层帧并且线程在断点或单步事件处挂起时,目标 VM 支持设置局部变量的值。在其他情况下,目标 VM 可能支持设置局部变量。
对象值必须是与变量类型兼容的赋值(这意味着必须通过封闭类的类加载器加载变量类型)。原始值必须是与变量类型兼容的赋值,或者必须可转换为变量类型而不丢失信息。有关分配兼容性的更多信息,请参阅 JLS 5.2 节。
- 参数:
variable- 包含请求值的字段value- 要分配的新值- 抛出:
IllegalArgumentException- 如果字段对该对象的类无效。InvalidTypeException- 如果值的类型与变量的类型不匹配。ClassNotLoadedException- 如果尚未通过适当的类加载器加载变量类型。InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。OpaqueFrameException- 如果此帧位于虚拟线程的调用堆栈上并且目标 VM 不支持在此帧中设置局部变量的值。VMCannotBeModifiedException- 如果 VirtualMachine 是只读的。- 参见:
-
getArgumentValues
返回此帧中所有参数的值。即使不存在局部变量信息,也会返回值。- 返回:
-
包含此帧的每个参数的
Value对象的列表,按照参数声明的顺序排列。如果与此框架对应的方法没有参数,则返回一个空列表。 - 抛出:
InvalidStackFrameException- 如果此堆栈帧已失效。一旦框架的线程恢复,堆栈框架就不再有效。- 自从:
- 1.6
-