Java Debug Wire Protocol Details

虚拟机命令集(1)

版本命令(1)

返回目标虚拟机实现的JDWP版本。版本字符串格式取决于实现。
输出数据
(无)
回复数据
类型 名称 描述
字符串 描述 关于VM版本的文本信息 
整数 jdwpMajor 主要JDWP版本号 
整数 jdwpMinor 次要JDWP版本号 
字符串 vmVersion 目标VM JRE版本,如java.version属性中所示 
字符串 vmName 目标VM名称,如java.vm.name属性中所示 
错误数据
描述
VM_DEAD 虚拟机未运行。 

按签名查找类命令(2)

返回目标VM加载的所有与给定签名匹配的类的引用类型。如果两个或更多类加载器加载了同名类,则将返回多个引用类型。搜索仅限于已加载的类;不会尝试加载给定签名的类。
输出数据
类型 名称 描述
字符串 signature 要查找的类的JNI签名(例如,"Ljava/lang/String;")。 
回复数据
类型 名称 描述
整数 classes 后续引用类型的数量。 
重复 classes 次:
字节
refTypeTag 以下引用类型的种类。  
referenceTypeID
typeID 匹配的已加载引用类型 
整数
status 当前类的状态。  
错误数据
描述
VM_DEAD 虚拟机未运行。 

所有类命令(3)

返回目标VM当前加载的所有类的引用类型。参见JVM TI GetLoadedClasses
输出数据
(无)
回复数据
类型 名称 描述
整数 classes 后续引用类型的数量。 
重复 classes 次:
字节
refTypeTag 以下引用类型的种类。  
referenceTypeID
typeID 已加载的引用类型 
字符串
signature 已加载引用类型的JNI签名 
整数
status 当前类的状态。  
错误数据
描述
VM_DEAD 虚拟机未运行。 

所有线程命令(4)

返回目标VM中的活动线程。尚未启动或已终止的线程不包含在列表中。

返回的列表包含目标VM中每个活动平台线程的线程ID。这包括使用Thread API创建的平台线程以及通过JNI代码附加到目标VM的所有本机线程。

如果列表中包含目标VM中的活动虚拟线程的线程ID,则取决于实现。目标VM可能不返回虚拟线程的线程ID,或者可能配置为返回某些或所有虚拟线程的线程ID。

输出数据
(无)
回复数据
类型 名称 描述
整数 threads 后续线程的数量。 
重复 threads 次:
线程ID
thread 一个运行中的线程 
错误数据
描述
VM_DEAD 虚拟机未运行。 

顶级线程组命令(5)

返回所有没有父级的线程组。此命令可用作构建现有线程组树(或树)的第一步。
输出数据
(无)
回复数据
类型 名称 描述
整数 groups 后续线程组的数量。 
重复 groups 次:
线程组ID
group 一个顶级线程组 
错误数据
描述
VM_DEAD 虚拟机未运行。 

释放命令(6)

使此虚拟机镜像无效。与目标VM的通信通道关闭,并且目标VM准备接受来自此调试器或另一个调试器的另一个后续连接,包括以下任务: 任何当前在目标VM中执行的方法调用在断开连接后继续。在完成任何此类方法调用后,调用线程将从最初停止的位置继续。

源自此VirtualMachine的资源(ObjectReferences、ReferenceTypes等)将变为无效。

输出数据
(无)
回复数据
(无)
错误数据
(无)

IDSizes命令(7)

返回目标VM中可变大小数据类型的大小。返回的值指示命令和回复数据包中标识符使用的字节数。
输出数据
(无)
回复数据
类型 名称 描述
int fieldIDSize 字段ID的字节大小  
int methodIDSize 方法ID的字节大小  
int objectIDSize 对象ID的字节大小  
int referenceTypeIDSize 引用类型ID的字节大小  
int frameIDSize 帧ID的字节大小  
错误数据
数值 描述
VM_DEAD 虚拟机未运行。 

暂停命令 (8)

暂停目标虚拟机中运行的应用程序的执行。当前运行的所有Java线程将被暂停。

虚拟机和单个线程的暂停都会被计数。在线程再次运行之前,必须通过VM级别的恢复命令或线程级别的恢复命令恢复相同次数被暂停的次数。

输出数据
(无)
回复数据
(无)
错误数据
数值 描述
VM_DEAD 虚拟机未运行。 

恢复命令 (9)

在暂停命令或事件停止其执行后恢复应用程序的执行。虚拟机和单个线程的暂停次数都会被计数。如果特定线程被暂停n次,则必须在继续之前恢复n次。
输出数据
(无)
回复数据
(无)
错误数据
(无)

退出命令 (10)

以给定的退出代码终止目标虚拟机。在某些平台上,退出代码可能会被截断,例如,截断为低8位。之前从目标虚拟机返回的所有ID将变为无效。在虚拟机中运行的线程将被突然终止。不会抛出线程死亡异常,也不会运行finally块。
输出数据
类型 名称 描述
int exitCode 退出代码 
回复数据
(无)
错误数据
(无)

创建字符串命令 (11)

在目标虚拟机中创建一个新的字符串对象并返回其ID。
输出数据
类型 名称 描述
string utf 用于创建字符串的UTF-8字符。 
回复数据
类型 名称 描述
stringID stringObject 创建的字符串(java.lang.String的实例) 
错误数据
数值 描述
VM_DEAD 虚拟机未运行。 

能力命令 (12)

检索此虚拟机的能力。能力以布尔值返回,每个值指示能力的存在或不存在。如果能力不可用,则与每个能力相关的命令将返回NOT_IMPLEMENTED错误。
输出数据
(无)
回复数据
类型 名称 描述
boolean canWatchFieldModification 虚拟机是否可以监视字段修改,因此是否可以发送修改观察点事件? 
boolean canWatchFieldAccess 虚拟机是否可以监视字段访问,因此是否可以发送访问观察点事件? 
boolean canGetBytecodes 虚拟机是否可以获取给定方法的字节码? 
boolean canGetSyntheticAttribute 虚拟机是否可以确定字段或方法是否是合成的?(即,虚拟机是否可以确定方法或字段是否由编译器发明?) 
boolean canGetOwnedMonitorInfo 虚拟机是否可以获取线程的拥有监视器信息? 
boolean canGetCurrentContendedMonitor 虚拟机是否可以获取线程的当前争用监视器? 
boolean canGetMonitorInfo 虚拟机是否可以获取给定对象的监视器信息? 
错误数据
数值 描述
VM_DEAD 虚拟机未运行。 

类路径命令 (13)

检索目标虚拟机的类路径和引导类路径。如果未定义类路径,则返回空列表。如果未定义引导类路径,则返回空列表。
输出数据
(无)
回复数据
类型 名称 描述
string baseDir 用于解析以下列表中相对路径的基本目录。 
int classpaths 类路径中的路径数。 
重复classpaths次:
string
path 类路径的一个组件 
int bootclasspaths 引导类路径中的路径数。 
重复bootclasspaths次:
string
path 引导类路径的一个组件 
错误数据
数值 描述
VM_DEAD 虚拟机未运行。 

释放对象命令 (14)

释放对象ID列表。对于列表中的每个对象,以下规则适用。后端持有的引用计数将减少refCnt。如果此后引用计数小于或等于零,则ID将被释放。与释放的ID相关的任何后端资源可能会被释放,并且如果对象的垃圾收集被禁用,则将重新启用。发送此命令的方发送者承诺不会再发送引用已释放的ID的命令。

不需要使用此命令。如果未发送此命令,则与每个ID关联的资源将在相应对象被垃圾收集后的某个时间由后端释放。最有用的情况是,如果从后端检索了大量对象(例如大型数组),但这些对象可能不会很快被垃圾收集,可以使用此命令减少后端的负载。

在使用此命令释放后,后端可以重新使用ID。此描述假定引用计数,后端可以使用任何等效操作的实现。

输出数据
类型 名称 描述
int requests 后续对象释放请求的数量 
重复requests次:
objectID
object 对象ID 
int
refCnt 此对象ID已包含在从后端接收的数据包中的次数。准确计数可防止在后端释放对象ID之前,如果它包含在尚未由前端处理的传入数据包中,则在后端释放对象ID。 
回复数据
(无)
错误数据
(无)

暂停事件命令 (15)告诉目标虚拟机停止发送事件。事件不会被丢弃;它们会被保留,直到发送后续的ReleaseEvents命令。在生成大量事件的情况下,此命令对于控制发送到调试器虚拟机的事件数量很有用。当事件被调试器后端保持时,应用程序执行可能会被调试器后端冻结,以防止后端缓冲区溢出。对命令的响应永远不会被保留,并且不受此命令的影响。如果事件已经被保留,此命令将被忽略。
输出数据
(无)
回复数据
(无)
错误数据
(无)

ReleaseEvents命令(16)

告诉目标虚拟机继续发送事件。此命令用于在HoldEvents命令后恢复正常活动。如果没有当前生效的HoldEvents命令,则此命令将被忽略。
输出数据
(无)
回复数据
(无)
错误数据
(无)

CapabilitiesNew命令(17)

检索此虚拟机的所有能力。这些能力以布尔值返回,每个值指示能力的存在或不存在。如果能力不可用,则与每个能力相关的命令将返回NOT_IMPLEMENTED错误。自JDWP版本1.4起。
输出数据
(无)
回复数据
类型 名称 描述
布尔值 canWatchFieldModification 虚拟机是否可以监视字段修改,从而可以发送修改观察点事件? 
布尔值 canWatchFieldAccess 虚拟机是否可以监视字段访问,从而可以发送访问观察点事件? 
布尔值 canGetBytecodes 虚拟机是否可以获取给定方法的字节码? 
布尔值 canGetSyntheticAttribute 虚拟机是否可以确定字段或方法是否是合成的?(即,虚拟机是否可以确定方法或字段是否是编译器发明的?) 
布尔值 canGetOwnedMonitorInfo 虚拟机是否可以获取线程的拥有监视器信息? 
布尔值 canGetCurrentContendedMonitor 虚拟机是否可以获取线程的当前争用监视器? 
布尔值 canGetMonitorInfo 虚拟机是否可以获取给定对象的监视器信息? 
布尔值 canRedefineClasses 虚拟机是否可以重新定义类? 
布尔值 canAddMethod 虚拟机在重新定义类时是否可以添加方法?

@Deprecated(自“15”起)基于JVM TI的JDWP后端永远不会将此能力设置为true。 

布尔值 canUnrestrictedlyRedefineClasses 虚拟机是否可以以通常受限制的方式重新定义类?

@Deprecated(自“15”起)基于JVM TI的JDWP后端永远不会将此能力设置为true。 

布尔值 canPopFrames 虚拟机是否可以弹出堆栈帧? 
布尔值 canUseInstanceFilters 虚拟机是否可以通过特定对象筛选事件? 
布尔值 canGetSourceDebugExtension 虚拟机是否可以获取源调试扩展? 
布尔值 canRequestVMDeathEvent 虚拟机是否可以请求VM死亡事件? 
布尔值 canSetDefaultStratum 虚拟机是否可以设置默认层次? 
布尔值 canGetInstanceInfo 虚拟机是否可以返回类的实例、实例计数和引用对象? 
布尔值 canRequestMonitorEvents 虚拟机是否可以请求监视器事件? 
布尔值 canGetMonitorFrameInfo 虚拟机是否可以获取带有帧深度信息的监视器? 
布尔值 canUseSourceNameFilters 虚拟机是否可以通过源名称筛选类准备事件? 
布尔值 canGetConstantPool 虚拟机是否可以返回常量池信息? 
布尔值 canForceEarlyReturn 虚拟机是否可以强制从方法中提前返回? 
布尔值 reserved22 保留给未来能力 
布尔值 reserved23 保留给未来能力 
布尔值 reserved24 保留给未来能力 
布尔值 reserved25 保留给未来能力 
布尔值 reserved26 保留给未来能力 
布尔值 reserved27 保留给未来能力 
布尔值 reserved28 保留给未来能力 
布尔值 reserved29 保留给未来能力 
布尔值 reserved30 保留给未来能力 
布尔值 reserved31 保留给未来能力 
布尔值 reserved32 保留给未来能力 
错误数据
描述
VM_DEAD 虚拟机未运行。 

RedefineClasses命令(18)

安装新的类定义。如果目标虚拟机中重新定义类的方法中存在活动堆栈帧,则这些活动帧将继续运行原始方法的字节码。这些方法被视为过时 - 请参见IsObsolete。重新定义类中的方法将用于目标虚拟机中的新调用。重新定义类中的所有断点都将被清除。如果需要重置堆栈帧,则可以使用PopFrames命令弹出具有过时方法的帧。

除非存在canUnrestrictedlyRedefineClasses能力,否则重新定义必须遵循JVM TI RedefineClasses中描述的限制。

需要canRedefineClasses能力 - 请参见CapabilitiesNew

@Deprecated(自“15”起)除了canRedefineClasses能力外,目标虚拟机必须具有canAddMethod能力以在重新定义类时添加方法,或者具有canUnrestrictedlyRedefineClasses能力以以通常受限制的方式重新定义类。

输出数据
类型 名称 描述
int classes 后跟的引用类型数量。 
重复 classes 次数:
referenceTypeID
refType 引用类型。 
int
classfile 定义类的字节数(下文)。 
重复 classfile 次数:
byte
classbyte JVM类文件格式中的字节。 
回复数据
(无)
错误数据
数值 描述
INVALID_CLASS 其中一个 refType 不是引用类型的ID。 
INVALID_OBJECT 其中一个 refType 不是已知的ID。 
UNSUPPORTED_VERSION 类文件具有此虚拟机不支持的版本号。 
INVALID_CLASS_FORMAT 虚拟机尝试读取一个类文件,并确定该文件格式不正确或无法解释为类文件。 
CIRCULAR_CLASS_DEFINITION 在初始化类时检测到循环引用。 
FAILS_VERIFICATION 验证器检测到一个类文件,虽然格式良好,但包含某种内部不一致性或安全问题。 
NAMES_DONT_MATCH 新类文件中定义的类名与旧类对象中的名称不同。 
NOT_IMPLEMENTED 此功能的任何方面都未实现(CapabilitiesNew.canRedefineClasses 为 false)。 
ADD_METHOD_NOT_IMPLEMENTED 添加方法尚未实现。 
SCHEMA_CHANGE_NOT_IMPLEMENTED 模式更改尚未实现。 
HIERARCHY_CHANGE_NOT_IMPLEMENTED 新类版本的直接超类与旧类版本不同,或直接实现的接口集不同,并且 canUnrestrictedlyRedefineClasses 为 false。 
DELETE_METHOD_NOT_IMPLEMENTED 新类版本未声明在旧类版本中声明的方法,并且 canUnrestrictedlyRedefineClasses 为 false。 
CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED 新类版本具有不同的修饰符,并且 canUnrestrictedlyRedefineClasses 为 false。 
METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED 新类版本中的方法具有与旧类版本中对应方法不同的修饰符,并且 canUnrestrictedlyRedefineClasses 为 false。 
CLASS_ATTRIBUTE_CHANGE_NOT_IMPLEMENTED 新类版本具有不同的 NestHost、NestMembers、PermittedSubclasses 或 Record 类属性,并且 canUnrestrictedlyRedefineClasses 为 false。 
VM_DEAD 虚拟机未运行。 

SetDefaultStratum 命令 (19)

设置默认层。需要 canSetDefaultStratum 能力 - 请参见 CapabilitiesNew
输出数据
类型 名称 描述
string stratumID 默认层,或空字符串以使用引用类型默认值。 
回复数据
(无)
错误数据
数值 描述
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

AllClassesWithGeneric 命令 (20)

返回目标虚拟机当前加载的所有类的引用类型。为每个类返回 JNI 签名和通用签名。通用签名在《Java虚拟机规范》的签名属性部分中描述。自 JDWP 版本 1.5 起。
输出数据
(无)
回复数据
类型 名称 描述
int classes 后跟的引用类型数量。 
重复 classes 次数:
byte
refTypeTag 以下引用类型的 类型。 
referenceTypeID
typeID 加载的引用类型。 
string
signature 加载的引用类型的 JNI 签名。 
string
genericSignature 加载的引用类型的通用签名,如果没有则为空字符串。 
int
status 当前类的 状态。 
错误数据
数值 描述
VM_DEAD 虚拟机未运行。 

InstanceCounts 命令 (21)

返回输入列表中每个引用类型的实例数。仅计算可达用于垃圾回收目的的实例。如果引用类型无效,例如已卸载,则其实例计数为零。

自 JDWP 版本 1.6 起。需要 canGetInstanceInfo 能力 - 请参见 CapabilitiesNew

输出数据
类型 名称 描述
int refTypesCount 后跟的引用类型数量。必须为非负数。 
重复 refTypesCount 次数:
referenceTypeID
refType 引用类型 ID。 
回复数据
类型 名称 描述
int counts 后跟的计数数量。 
重复 counts 次数:
long
instanceCount '输出数据' 中相应引用类型的实例数。 
错误数据
数值 描述
ILLEGAL_ARGUMENT refTypesCount 小于零。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

AllModules 命令 (22)

返回目标虚拟机中的所有模块。

自 JDWP 版本 9 起。

输出数据
(无)
回复数据
类型 名称 描述
int modules 后续模块的数量。 
重复 modules 次:
moduleID
module 其中一个模块。 
错误数据
数值 描述
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

ReferenceType 命令集 (2)

Signature 命令 (1)

返回引用类型的类型签名。类型签名格式与 JVM TI GetClassSignature 中指定的相同。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型 ID。 
回复数据
类型 名称 描述
string signature 引用类型的 JNI 签名。 
错误数据
数值 描述
INVALID_CLASS refType 不是引用类型的 ID。 
INVALID_OBJECT refType 不是已知的 ID。 
VM_DEAD 虚拟机未运行。 

ClassLoader 命令 (2)

返回加载给定引用类型的 java.lang.ClassLoader 实例。如果引用类型是由系统类加载器加载的,则返回的对象 ID 为 null。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型 ID。 
回复数据
类型 名称 描述
classLoaderID classLoader 引用类型的类加载器。 
错误数据
数值 描述
INVALID_CLASS refType 不是引用类型的 ID。 
INVALID_OBJECT refType 不是已知的 ID。 
VM_DEAD 虚拟机未运行。 

Modifiers 命令 (3)

返回引用类型的修饰符(也称为访问标志)。返回的位掩码包含有关引用类型声明的信息。如果引用类型是数组或原始类(例如,java.lang.Integer.TYPE),则返回的位掩码的值是未定义的。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型 ID。 
回复数据
类型 名称 描述
int modBits 修饰符位,如《Java虚拟机规范》第4章中定义的。 
错误数据
数值 描述
INVALID_CLASS refType 不是引用类型的 ID。 
INVALID_OBJECT refType 不是已知的 ID。 
VM_DEAD 虚拟机未运行。 

Fields 命令 (4)

返回引用类型中每个字段的信息。不包括继承的字段。字段列表将包括编译器创建的任何合成字段。字段按照它们在类文件中出现的顺序返回。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型 ID。 
回复数据
类型 名称 描述
int declared 声明字段的数量。 
重复 declared 次:
fieldID
fieldID 字段 ID。 
string
name 字段名称。 
string
signature 字段的 JNI 签名。 
int
modBits 修饰符位标志(也称为访问标志),提供有关字段声明的附加信息。单个标志值在《Java虚拟机规范》第4章中定义。此外,如果可用,则 0xf0000000 位标识字段为合成字段,如果合成属性 capability 可用。 
错误数据
数值 描述
CLASS_NOT_PREPARED 类已加载但尚未准备好。 
INVALID_CLASS refType 不是引用类型的 ID。 
INVALID_OBJECT refType 不是已知的 ID。 
VM_DEAD 虚拟机未运行。 

Methods 命令 (5)

返回引用类型中每个方法的信息。不包括继承的方法。方法列表将包括构造函数(用名称 "<init>" 标识)、初始化方法(如果存在,用名称 "<clinit>" 标识)以及编译器创建的任何合成方法。方法按照它们在类文件中出现的顺序返回。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
int declared 已声明方法的数量。 
重复declared次数:
methodID
methodID 方法ID。 
string
name 方法名称。 
string
signature 方法的JNI签名。 
int
modBits 修饰符位标志(也称为访问标志),提供有关方法声明的附加信息。单个标志值在《Java虚拟机规范》第4章中定义。此外,如果可用,则0xf0000000位标识方法为合成方法,如果合成属性capability可用。 
错误数据
描述
CLASS_NOT_PREPARED 类已加载但尚未准备好。 
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
VM_DEAD 虚拟机未运行。 

GetValues命令(6)

返回引用类型的一个或多个静态字段的值。每个字段必须是引用类型或其超类、超接口或实现的接口的成员。不执行访问控制;例如,可以获取私有字段的值。 
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
int fields 要获取的值的数量。 
重复fields次数:
fieldID
fieldID 要获取的字段。 
回复数据
类型 名称 描述
int values 返回的值的数量,始终等于fields,要获取的值的数量。 
重复values次数:
value
value 字段值。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
INVALID_FIELDID 无效字段。 
VM_DEAD 虚拟机未运行。 

SourceFile命令(7)

返回声明引用类型的源文件的名称。 
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
string sourceFile 源文件名称。不包括文件的路径信息。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
ABSENT_INFORMATION 源文件属性不存在。 
VM_DEAD 虚拟机未运行。 

NestedTypes命令(8)

返回直接嵌套在此类型中的类和接口。不包括进一步嵌套在这些类型中的类型。 
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
int classes 嵌套类和接口的数量。 
重复classes次数:
byte
refTypeTag 以下引用类型的种类。 
referenceTypeID
typeID 嵌套类或接口的ID。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
VM_DEAD 虚拟机未运行。 

Status命令(9)

返回引用类型的当前状态。状态指示引用类型已初始化的程度,如《Java虚拟机规范》第2.1.6节所述。如果类已链接,则返回的状态位中的PREPARED和VERIFIED位将被设置。如果类已初始化,则返回的状态位中的INITIALIZED位将被设置。如果在初始化过程中发生错误,则返回的状态位中的ERROR位将被设置。对于数组类型和原始类(例如java.lang.Integer.TYPE),返回的状态位未定义。 
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
int status 状态位:参见JDWP.ClassStatus 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
VM_DEAD 虚拟机未运行。 

接口命令(10)

返回此类声明为实现的接口。间接实现的接口(由实现的接口扩展或由超类实现)不包括在内。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
int interfaces 实现的接口数量。 
重复interfaces次数:
interfaceID
interfaceType 实现的接口。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
VM_DEAD 虚拟机未运行。 

类对象命令(11)

返回与此类型对应的类对象。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
classObjectID classObject 类对象。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
VM_DEAD 虚拟机未运行。 

SourceDebugExtension命令(12)

返回SourceDebugExtension属性的值。自JDWP版本1.4起需要canGetSourceDebugExtension功能 - 请参见CapabilitiesNew
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
string extension 扩展属性。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
ABSENT_INFORMATION 如果未指定扩展。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

带泛型签名命令(13)

返回引用类型的JNI签名以及泛型签名(如果有)。泛型签名在Java虚拟机规范的签名属性部分中描述。自JDWP版本1.5起。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
string signature 引用类型的JNI签名。 
string genericSignature 引用类型的泛型签名,如果没有则为空字符串。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
VM_DEAD 虚拟机未运行。 

带泛型字段命令(14)

返回引用类型中每个字段的信息,包括泛型签名(如果有)。不包括继承的字段。字段列表将包括编译器创建的任何合成字段。字段按照它们在类文件中出现的顺序返回。泛型签名在Java虚拟机规范的签名属性部分中描述。自JDWP版本1.5起。
输出数据
类型 名称 描述
referenceTypeID refType 引用类型ID。 
回复数据
类型 名称 描述
int declared 声明的字段数量。 
重复declared次数:
fieldID
fieldID 字段ID。 
string
name 字段的名称。 
string
signature 字段的JNI签名。 
string
genericSignature 字段的泛型签名,如果没有则为空字符串。 
int
modBits 修饰符位标志(也称为访问标志),提供有关字段声明的附加信息。单个标志值在Java虚拟机规范的第4章中定义。此外,如果可用,则0xf0000000位标识字段为合成字段,如果合成属性capability可用。 
错误数据
描述
CLASS_NOT_PREPARED 类已加载但尚未准备好。 
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
VM_DEAD 虚拟机未运行。 

带泛型方法命令(15)

返回参考类型中每个方法的信息,包括通用签名(如果有的话)。不包括继承的方法。方法列表将包括构造函数(用名称“<init>”标识)、初始化方法(如果存在,用名称“<clinit>”标识)以及编译器创建的任何合成方法。方法按照它们在类文件中出现的顺序返回。通用签名在Java虚拟机规范中的签名属性部分中描述。自JDWP版本1.5起。
输出数据
类型 名称 描述
referenceTypeID refType 参考类型ID。
回复数据
类型 名称 描述
int declared 声明的方法数量。
重复declared次数:
methodID
methodID 方法ID。
string
name 方法名称。
string
signature 方法的JNI签名。
string
genericSignature 方法的通用签名,如果没有则为空字符串。
int
modBits 修饰符位标志(也称为访问标志),提供有关方法声明的附加信息。单个标志值在Java虚拟机规范的第4章中定义。此外,如果可用,则0xf0000000位标识方法为合成方法,如果合成属性capability可用。
错误数据
描述
CLASS_NOT_PREPARED 类已加载但尚未准备好。
INVALID_CLASS refType不是引用类型的ID。
INVALID_OBJECT refType不是已知ID。
VM_DEAD 虚拟机未运行。

Instances Command (16)

返回此引用类型的实例。仅返回可达用于垃圾回收目的的实例。

自JDWP版本1.6起。需要canGetInstanceInfo功能 - 请参阅CapabilitiesNew

输出数据
类型 名称 描述
referenceTypeID refType 参考类型ID。
int maxInstances 要返回的最大实例数。必须是非负数。如果为零,则返回所有实例。
回复数据
类型 名称 描述
int instances 后跟的实例数量。
重复instances次数:
tagged-objectID
instance 此引用类型的一个实例。
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。
INVALID_OBJECT refType不是已知ID。
ILLEGAL_ARGUMENT maxInstances小于零。
NOT_IMPLEMENTED 此虚拟机中未实现该功能。
VM_DEAD 虚拟机未运行。

ClassFileVersion Command (17)

返回类文件的主要版本号和次要版本号,如Java虚拟机规范的类文件格式中定义。

自JDWP版本1.6起。

输出数据
类型 名称 描述
referenceTypeID refType 类。
回复数据
类型 名称 描述
int majorVersion 主要版本号。
int minorVersion 次要版本号。
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。
INVALID_OBJECT refType不是已知ID。
ABSENT_INFORMATION 原始类型和数组类型的类文件版本信息不存在。
VM_DEAD 虚拟机未运行。

ConstantPool Command (18)

返回常量池的原始字节,格式为Java虚拟机规范中的constant_pool项格式。

自JDWP版本1.6起。需要canGetConstantPool功能 - 请参阅CapabilitiesNew

输出数据
类型 名称 描述
referenceTypeID refType 类。
回复数据
类型 名称 描述
int count 常量池条目总数加一。这对应于Java虚拟机规范中的constant_pool_count项。
int bytes  
重复bytes次数:
byte
cpbytes 常量池的原始字节。
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。
INVALID_OBJECT refType不是已知ID。
NOT_IMPLEMENTED 目标虚拟机不支持检索常量池信息。
ABSENT_INFORMATION 原始类型和数组类型的常量池信息不存在。
VM_DEAD 虚拟机未运行。

Module Command (19)

返回此引用类型所属的模块。

自JDWP版本9起。

输出数据
类型 名称 描述
referenceTypeID refType 引用类型的ID。
回复数据
类型 名称 描述
moduleID module 此引用类型所属的模块。
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。
INVALID_OBJECT refType不是已知的ID。
NOT_IMPLEMENTED 此虚拟机中未实现该功能。
VM_DEAD 虚拟机未运行。

ClassType 命令集 (3)

Superclass 命令 (1)

返回类的直接超类。
输出数据
类型 名称 描述
classID clazz 类类型的ID。
回复数据
类型 名称 描述
classID superclass 超类(如果指定了java.lang.Object的类ID,则为null)。
错误数据
描述
INVALID_CLASS clazz不是类的ID。
INVALID_OBJECT clazz不是已知的ID。
VM_DEAD 虚拟机未运行。

SetValues 命令 (2)

设置一个或多个静态字段的值。每个字段必须是类类型或其超类、超接口或实现的接口的成员。不执行访问控制;例如,可以设置私有字段的值。无法设置final字段。对于原始值,值的类型必须与字段的类型完全匹配。对于对象值,值的类型必须存在从值的类型到字段的类型的扩展引用转换,并且字段的类型必须已加载。
输出数据
类型 名称 描述
classID clazz 类类型的ID。
int values 要设置的字段数。
重复 values 次:
fieldID
fieldID 要设置的字段。
untagged-value
value 要放入字段的值。
回复数据
(无)
错误数据
描述
INVALID_CLASS clazz不是类的ID。
CLASS_NOT_PREPARED 类已加载但尚未准备好。
INVALID_OBJECT clazz不是已知的ID或对象字段的值不是已知的ID。
INVALID_FIELDID 无效字段。
VM_DEAD 虚拟机未运行。

InvokeMethod 命令 (3)

调用静态方法。方法必须是类类型或其超类的成员。不执行访问控制;例如,可以调用私有方法。

方法调用将在指定的线程中发生。只有在指定线程已被事件暂停时才能发生方法调用。当目标虚拟机被前端暂停时,不支持方法调用。

指定的方法将使用指定参数列表中的参数进行调用。方法调用是同步的;直到在目标虚拟机中调用的方法返回时才发送回复数据包。返回值(可能是void值)包含在回复数据包中。如果调用的方法引发异常,则异常对象ID将设置在回复数据包中;否则,异常对象ID为null。

对于原始参数,参数值的类型必须与参数的类型完全匹配。对于对象参数,参数值的类型必须存在从参数值的类型到参数的类型的扩展引用转换,并且参数的类型必须已加载。

默认情况下,在调用方法时,如果之前由事件或命令暂停了目标虚拟机中的所有线程,则会恢复所有线程。这样做是为了防止在调用的方法需要的监视器由任何线程拥有时会发生死锁。然而,请注意,在调用过程中可能会发生断点或其他事件。但是,请注意,此隐式恢复的行为与ThreadReference resume命令完全相同,因此如果线程的暂停计数大于1,则在调用过程中它将保持暂停状态。默认情况下,当调用完成时,目标虚拟机中的所有线程都会被暂停,无论调用前它们的状态如何。

在调用期间,可以通过在options字段中指定INVOKE_SINGLE_THREADED位标志来阻止调用时其他线程的恢复;但是,对于上述死锁没有保护或恢复,因此应谨慎使用此选项。只有指定的线程将被恢复(如上述所有线程所述)。在单线程调用完成后,调用线程将再次被暂停。请注意,在单线程调用期间启动的任何线程在调用完成时不会被暂停。

如果在调用期间断开目标虚拟机(例如,通过VirtualMachine dispose命令),方法调用将继续。

输出数据
类型 名称 描述
classID clazz 类类型的ID。
threadID thread 要调用的线程。
methodID methodID 要调用的方法。
int arguments  
重复 arguments 次:
value
arg 参数值。
int options 调用选项
回复数据
类型 名称 描述
value returnValue 返回的值。
tagged-objectID exception 抛出的异常。
错误数据
描述
INVALID_CLASS clazz不是类的ID。
INVALID_OBJECT clazz不是已知的ID。
INVALID_METHODID methodID不是该类类型或其超类中的静态方法的ID。
INVALID_THREAD 线程为null或不是有效线程。
THREAD_NOT_SUSPENDED 如果指定的线程尚未被事件暂停。
VM_DEAD 虚拟机未运行。

NewInstance 命令 (4)

创建此类型的新对象,调用指定的构造函数。构造函数方法ID必须是类类型的成员。

实例创建将在指定线程中发生。只有在指定线程被事件暂停后,才能发生实例创建。当目标VM被前端暂停时,不支持方法调用。

使用指定参数列表调用指定构造函数。构造函数调用是同步的;直到在目标VM中调用的方法返回后才发送回复数据包。返回值(可能是void值)包含在回复数据包中。如果构造函数抛出异常,则异常对象ID将设置在回复数据包中;否则,异常对象ID为null。

对于基本类型参数,参数值的类型必须与参数的类型完全匹配。对于对象参数,参数值的类型必须存在从参数值的类型到参数类型的扩展引用转换,并且参数类型必须已加载。

默认情况下,在调用方法时,如果之前被事件或命令暂停的所有线程都将恢复。这样做是为了防止发生死锁,因为任何线程拥有调用方法所需的监视器。在调用过程中可能会发生断点或其他事件。但请注意,这种隐式恢复的行为与ThreadReference resume命令完全相同,因此如果线程的暂停计数大于1,则在调用过程中它将保持暂停状态。默认情况下,当调用完成时,目标VM中的所有线程都将被暂停,而不管它们在调用之前的状态如何。

在调用过程中可以通过在options字段中指定INVOKE_SINGLE_THREADED位标志来阻止其他线程的恢复;但是,对上述死锁没有保护或恢复措施,因此应该非常谨慎使用此选项。只有指定的线程将被恢复(如上所述的所有线程)。在单线程调用完成后,调用线程将再次被暂停。请注意,在单线程调用期间启动的任何线程在调用完成时将不会被暂停。

如果在调用过程中断开目标VM(例如,通过VirtualMachine dispose命令),方法调用将继续。

输出数据
类型 名称 描述
classID clazz 类类型ID。 
threadID thread 要调用构造函数的线程。 
methodID methodID 要调用的构造函数。 
int arguments  
重复arguments次数:
value
arg 参数值。 
int options 构造函数调用选项。 
回复数据
类型 名称 描述
tagged-objectID newObject 新创建的对象,如果构造函数抛出异常则为null。 
tagged-objectID exception 抛出的异常,如果有的话;否则为null。 
错误数据
描述
INVALID_CLASS clazz不是类的ID。 
INVALID_OBJECT clazz不是已知ID或对象参数的值不是已知ID。 
INVALID_METHODID methodID不是方法的ID。 
INVALID_OBJECT 如果此引用类型已被卸载并已被垃圾回收。 
INVALID_THREAD 线程为null或不是有效线程。 
THREAD_NOT_SUSPENDED 如果指定线程尚未被事件暂停。 
VM_DEAD 虚拟机未运行。 

ArrayType命令集(4)

NewInstance命令(1)

使用给定长度创建此类型的新数组对象。
输出数据
类型 名称 描述
arrayTypeID arrType 新实例的数组类型。 
int length 数组的长度。 
回复数据
类型 名称 描述
tagged-objectID newArray 新创建的数组对象。 
错误数据
描述
INVALID_ARRAY 数组无效。 
INVALID_OBJECT 如果此引用类型已被卸载并已被垃圾回收。 
VM_DEAD 虚拟机未运行。 

InterfaceType命令集(5)

InvokeMethod命令(1)

调用静态方法。方法不能是静态初始化程序。方法必须是接口类型的成员。

自JDWP版本1.8起

方法调用将在指定线程中发生。只有在指定线程被事件暂停后,才能发生方法调用。当目标VM被前端暂停时,不支持方法调用。

使用指定参数列表调用指定方法。方法调用是同步的;直到在目标VM中调用的方法返回后才发送回复数据包。返回值(可能是void值)包含在回复数据包中。如果调用的方法抛出异常,则异常对象ID将设置在回复数据包中;否则,异常对象ID为null。

对于基本类型参数,参数值的类型必须与参数的类型完全匹配。对于对象参数,参数值的类型必须存在从参数值的类型到参数类型的扩展引用转换,并且参数类型必须已加载。

默认情况下,在调用方法时,如果之前被事件或命令暂停的所有线程都将恢复。这样做是为了防止发生死锁,因为任何线程拥有调用方法所需的监视器。在调用过程中可能会发生断点或其他事件。但请注意,这种隐式恢复的行为与ThreadReference resume命令完全相同,因此如果线程的暂停计数大于1,则在调用过程中它将保持暂停状态。默认情况下,当调用完成时,目标VM中的所有线程都将被暂停,而不管它们在调用之前的状态如何。

在调用过程中可以通过在options字段中指定INVOKE_SINGLE_THREADED位标志来阻止其他线程的恢复;但是,对上述死锁没有保护或恢复措施,因此应该非常谨慎使用此选项。只有指定的线程将被恢复(如上所述的所有线程)。在单线程调用完成后,调用线程将再次被暂停。请注意,在单线程调用期间启动的任何线程在调用完成时将不会被暂停。

如果在调用过程中断开目标VM(例如,通过VirtualMachine dispose命令),方法调用将继续。

输出数据
类型 名称 描述
interfaceID clazz 接口类型ID。 
threadID thread 要调用的线程。 
methodID methodID 要调用的方法。 
int arguments  
重复 arguments 次数:
value
arg 参数值。 
int options 调用的选项 
回复数据
类型 名称 描述
value returnValue 返回的值。 
tagged-objectID exception 抛出的异常。 
错误数据
描述
INVALID_CLASS clazz不是接口的ID。 
INVALID_OBJECT clazz不是已知的ID。 
INVALID_METHODID methodID不是此接口类型中静态方法的ID,或者是静态初始化程序的ID。 
INVALID_THREAD 线程为空或不是有效的线程。 
THREAD_NOT_SUSPENDED 如果指定的线程尚未被事件挂起。 
VM_DEAD 虚拟机未运行。 

方法命令集 (6)

LineTable 命令 (1)

如果存在,返回方法的行号信息。行表将源行号映射到行的初始代码索引。行表按代码索引排序(从低到高)。行号信息是恒定的,除非使用 RedefineClasses 安装了新的类定义。
输出数据
类型 名称 描述
referenceTypeID refType 类。 
methodID methodID 方法。 
回复数据
类型 名称 描述
long start 方法的最低有效代码索引,>=0,如果方法是本地方法则为-1。 
long end 方法的最高有效代码索引,>=0,如果方法是本地方法则为-1。 
int lines 此方法的行表中的条目数。 
重复 lines 次数:
long
lineCodeIndex 行的初始代码索引,start <= lineCodeIndex < end。 
int
lineNumber 行号。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知的ID。 
INVALID_METHODID methodID不是方法的ID。 
VM_DEAD 虚拟机未运行。 

VariableTable 命令 (2)

返回方法的变量信息。变量表包括在方法内声明的参数和局部变量。对于实例方法,"this" 引用也包含在表中。此外,可能存在合成变量。
输出数据
类型 名称 描述
referenceTypeID refType 类。 
methodID methodID 方法。 
回复数据
类型 名称 描述
int argCnt 帧中由参数使用的字数。八字节参数使用两个字;其他所有参数使用一个字。 
int slots 变量的数量。 
重复 slots 次数:
long
codeIndex 变量可见的第一个代码索引(无符号)。与 length 结合使用。只有当当前 codeIndex <= 当前帧代码索引 < codeIndex + length 时,才能获取或设置变量。 
string
name 变量的名称。 
string
signature 变量类型的JNI签名。 
int
length codeIndex 结合使用的无符号值。只有当当前 codeIndex <= 当前帧代码索引 < code index + length 时,才能获取或设置变量。 
int
slot 局部变量在其帧中的索引。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知的ID。 
INVALID_METHODID methodID不是方法的ID。 
ABSENT_INFORMATION 方法没有变量信息。 
VM_DEAD 虚拟机未运行。 

Bytecodes 命令 (3)

检索方法的字节码,如 Java虚拟机规范 中定义。需要 canGetBytecodes 能力 - 请参阅 CapabilitiesNew
输出数据
类型 名称 描述
referenceTypeID refType 类。 
methodID methodID 方法。 
回复数据
类型 名称 描述
int bytes  
重复 bytes 次:
byte
bytecode Java字节码。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
INVALID_METHODID methodID不是方法的ID。 
NOT_IMPLEMENTED 如果目标虚拟机不支持检索字节码。 
VM_DEAD 虚拟机未运行。 

IsObsolete Command (4)

确定此方法是否已过时。如果该方法已被使用 RedefineClasses 命令替换为一个非等效方法,则该方法已过时。如果原始方法和重新定义的方法的字节码相同,除了常量池中的索引和引用的常量相等,则它们被视为等效。
输出数据
类型 名称 描述
referenceTypeID refType 类。 
methodID methodID 方法。 
回复数据
类型 名称 描述
boolean isObsolete 如果此方法已被使用RedefineClasses命令替换为一个非等效方法,则为true。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
INVALID_METHODID methodID不是方法的ID。 
NOT_IMPLEMENTED 如果目标虚拟机不支持此查询。 
VM_DEAD 虚拟机未运行。 

VariableTableWithGeneric Command (5)

返回方法的变量信息,包括变量的泛型签名。变量表包括在方法内声明的参数和局部变量。对于实例方法,"this"引用也包含在表中。此外,可能存在合成变量。泛型签名在 The Java Virtual Machine Specification 的签名属性部分中描述。自JDWP版本1.5起。
输出数据
类型 名称 描述
referenceTypeID refType 类。 
methodID methodID 方法。 
回复数据
类型 名称 描述
int argCnt 参数帧中使用的字数。八字节参数使用两个字;其他所有参数使用一个字。 
int slots 变量的数量。 
重复 slots 次:
long
codeIndex 变量可见的第一个代码索引(无符号)。与length一起使用。只有当当前codeIndex <= 当前帧代码索引 < codeIndex + length 时,才能获取或设置变量。 
string
name 变量的名称。 
string
signature 变量类型的JNI签名。 
string
genericSignature 变量类型的泛型签名,如果没有则为空字符串。 
int
length codeIndex一起使用的无符号值。只有当当前codeIndex <= 当前帧代码索引 < code index + length 时,才能获取或设置变量。 
int
slot 局部变量在其帧中的索引。 
错误数据
描述
INVALID_CLASS refType不是引用类型的ID。 
INVALID_OBJECT refType不是已知ID。 
INVALID_METHODID methodID不是方法的ID。 
ABSENT_INFORMATION 方法没有变量信息。 
VM_DEAD 虚拟机未运行。 

Field Command Set (8)

ObjectReference Command Set (9)

ReferenceType Command (1)

返回对象的运行时类型。运行时类型将是一个类或一个数组。
输出数据
类型 名称 描述
objectID object 对象ID。 
回复数据
类型 名称 描述
byte refTypeTag 后续引用类型的种类。 
referenceTypeID typeID 运行时引用类型。 
错误数据
描述
INVALID_OBJECT 如果此引用类型已被卸载并进行了垃圾回收。 
VM_DEAD 虚拟机未运行。 

GetValues Command (2)

返回一个或多个实例字段的值。每个字段必须是对象类型或其超类、超接口或实现的接口的成员。不执行访问控制;例如,可以获取私有字段的值。
输出数据
类型 名称 描述
objectID 对象 对象ID
int 字段 要获取的值的数量
重复 字段 次数:
fieldID
fieldID 要获取的字段
回复数据
类型 名称 描述
int 返回的值的数量,始终等于'字段',要获取的值的数量。字段值在回复中按照与命令中相应的fieldID相同的顺序排序。
重复 次数:
value
value 字段值
错误数据
描述
INVALID_OBJECT 如果此引用类型已被卸载并进行了垃圾回收。
INVALID_FIELDID 无效的字段。
VM_DEAD 虚拟机未运行。

SetValues 命令 (3)

设置一个或多个实例字段的值。每个字段必须是对象类型的成员或其超类、超接口或实现的接口之一。不执行访问控制;例如,可以设置私有字段的值。对于原始值,值的类型必须与字段的类型完全匹配。对于对象值,值的类型必须能够进行宽化引用转换到字段的类型,并且字段的类型必须已加载。
输出数据
类型 名称 描述
objectID 对象 对象ID
int 要设置的字段数量
重复 次数:
fieldID
fieldID 要设置的字段
未标记的值
value 要放入字段的值
回复数据
(无)
错误数据
描述
INVALID_OBJECT 如果此引用类型已被卸载并进行了垃圾回收。
INVALID_FIELDID 无效的字段。
VM_DEAD 虚拟机未运行。

MonitorInfo 命令 (5)

返回对象的监视器信息。所有虚拟机中的线程必须被暂停。需要 canGetMonitorInfo 能力 - 请参见 CapabilitiesNew
输出数据
类型 名称 描述
objectID 对象 对象ID
回复数据
类型 名称 描述
threadID owner 监视器所有者,如果当前未拥有则为 null。
int entryCount 监视器已进入的次数。
int waiters 正在等待监视器的线程数,如果当前没有所有者则为 0。
重复 waiters 次数:
threadID
thread 等待此监视器的线程。
错误数据
描述
INVALID_OBJECT 如果此引用类型已被卸载并进行了垃圾回收。
NOT_IMPLEMENTED 此功能在此虚拟机中未实现。
VM_DEAD 虚拟机未运行。

InvokeMethod 命令 (6)

调用实例方法。方法必须是对象类型的成员或其超类、超接口或实现的接口之一。不执行访问控制;例如,可以调用私有方法。

方法调用将在指定线程中发生。只有在指定线程已被事件暂停时才能进行方法调用。当目标虚拟机被前端暂停时,不支持方法调用。

指定的方法将使用指定参数列表中的参数进行调用。方法调用是同步的;直到在目标虚拟机中调用的方法返回后才发送回复数据包。返回值(可能是 void 值)包含在回复数据包中。如果调用的方法引发异常,则异常对象ID将设置在回复数据包中;否则,异常对象ID为 null。

对于原始参数,参数值的类型必须与参数的类型完全匹配。对于对象参数,参数值的类型必须能够进行宽化引用转换到参数的类型,并且参数的类型必须已加载。

默认情况下,在调用方法时,如果之前被事件或命令暂停的所有线程将被恢复。这样做是为了防止在调用的方法中需要的任何线程拥有监视器时发生死锁。然而,可能在调用过程中发生断点或其他事件。请注意,这种隐式恢复的行为与 ThreadReference 恢复命令完全相同,因此如果线程的暂停计数大于 1,则在调用过程中它将保持暂停状态。默认情况下,当调用完成时,目标虚拟机中的所有线程都将被暂停,无论调用前它们的状态如何。

在调用期间,可以通过在 options 字段中指定 INVOKE_SINGLE_THREADED 位标志来阻止调用时其他线程的恢复;但是,对于上述死锁没有保护或恢复,因此应谨慎使用此选项。只有指定的线程将被恢复(如上述所有线程所述)。在单线程调用完成后,调用线程将再次被暂停。请注意,在单线程调用期间启动的任何线程在调用完成时不会被暂停。

如果在调用期间断开目标虚拟机(例如,通过 VirtualMachine dispose 命令),方法调用将继续进行。

输出数据
类型 名称 描述
objectID 对象 对象ID
threadID 线程 要调用的线程
classID 类类型
methodID 方法ID 要调用的方法
int 参数 参数数量
重复 参数 次数:
参数 参数值
int 选项 调用选项
回复数据
类型 名称 描述
返回值 返回的值,如果抛出异常则为null
标记对象ID 异常 抛出的异常(如果有)
错误数据
描述
INVALID_OBJECT 如果此引用类型已被卸载和垃圾回收
INVALID_CLASS clazz不是引用类型的ID
INVALID_METHODID methodID不是此对象类型或其超类、超接口或实现接口中实例方法的ID
INVALID_THREAD 线程为空或不是有效的线程
THREAD_NOT_SUSPENDED 如果指定的线程尚未被事件暂停
VM_DEAD 虚拟机未运行

DisableCollection Command (7)

阻止给定对象的垃圾回收。默认情况下,后端回复中的所有对象都可能在目标VM运行时的任何时候被回收。调用此命令可保证对象不会被回收。可以使用 EnableCollection 命令再次允许回收。

请注意,当目标VM暂停时,不会发生垃圾回收,因为所有线程都被暂停。在暂停期间对变量、字段和数组的典型检查是安全的,无需显式禁用垃圾回收。

应该谨慎使用此方法,因为它改变了目标VM中的垃圾回收模式,因此可能导致在调试器下应用程序行为与非调试状态下不同。

输出数据
类型 名称 描述
objectID 对象 对象ID
回复数据
(无)
错误数据
描述
INVALID_OBJECT 如果此引用类型已被卸载和垃圾回收
VM_DEAD 虚拟机未运行

EnableCollection Command (8)

允许此对象进行垃圾回收。默认情况下,JDWP返回的所有对象可能在目标VM中变得不可达,因此可能被垃圾回收。只有在先前使用 DisableCollection 命令禁用垃圾回收时才需要调用此命令。
输出数据
类型 名称 描述
objectID 对象 对象ID
回复数据
(无)
错误数据
描述
VM_DEAD 虚拟机未运行

IsCollected Command (9)

确定对象是否在目标VM中已被垃圾回收。
输出数据
类型 名称 描述
objectID 对象 对象ID
回复数据
类型 名称 描述
布尔值 isCollected 如果对象已被回收则为true;否则为false
错误数据
描述
INVALID_OBJECT 如果此引用类型已被卸载和垃圾回收
VM_DEAD 虚拟机未运行

ReferringObjects Command (10)

返回直接引用此对象的对象。仅返回可达于垃圾回收目的的对象。请注意,对象还可以以其他方式被引用,例如从堆栈帧中的局部变量引用,或从JNI全局引用引用。此类非对象引用者不会被此命令返回。

自JDWP版本1.6起。需要canGetInstanceInfo功能 - 请参阅 CapabilitiesNew

输出数据
类型 名称 描述
objectID 对象 对象ID
int maxReferrers 要返回的引用对象的最大数量。必须为非负数。如果为零,则返回所有引用对象。
回复数据
类型 名称 描述
int referringObjects 后续对象的数量
重复 referringObjects 次数:
标记对象ID
实例 引用此对象的对象
错误数据
描述
INVALID_OBJECT 对象不是已知ID
ILLEGAL_ARGUMENT maxReferrers小于零
NOT_IMPLEMENTED 此虚拟机中未实现该功能
VM_DEAD 虚拟机未运行

StringReference Command Set (10)

Value Command (1)

返回字符串中包含的字符
输出数据
类型 名称 描述
objectID stringObject 字符串对象ID。 
回复数据
类型 名称 描述
字符串 stringValue 字符串值的UTF-8表示。 
错误数据
描述
INVALID_STRING 字符串无效。 
INVALID_OBJECT 如果此引用类型已被卸载并垃圾回收。 
VM_DEAD 虚拟机未运行。 

ThreadReference 命令集 (11)

Name 命令 (1)

返回线程名称。
输出数据
类型 名称 描述
threadID thread 线程对象ID。 
回复数据
类型 名称 描述
字符串 threadName 线程名称。 
错误数据
描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

Suspend 命令 (2)

暂停线程。

虚拟机和单个线程的暂停都会计数。在线程再次运行之前,必须恢复相同次数的暂停。

暂停单个线程本质上容易发生死锁。如果暂停的线程持有另一个正在运行线程所需的监视器,则在目标虚拟机中可能发生死锁(至少直到再次恢复暂停的线程为止)。

暂停的线程保证保持暂停状态,直到通过上述JDI恢复方法之一恢复为止。

请注意,这不会改变线程的状态(请参阅ThreadStatus命令)。例如,如果它正在运行,则对其他线程仍然会显示为正在运行。

输出数据
类型 名称 描述
threadID thread 线程对象ID。 
回复数据
(无)
错误数据
描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

Resume 命令 (3)

恢复给定线程的执行。如果此线程之前未被前端暂停,调用此命令将不起作用。否则,此线程上挂起的挂起计数将递减。如果递减为0,则线程将继续执行。
输出数据
类型 名称 描述
threadID thread 线程对象ID。 
回复数据
(无)
错误数据
描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

Status 命令 (4)

返回线程的当前状态。线程状态回复指示线程上次运行时的线程状态。挂起状态提供有关线程暂停的信息。
输出数据
类型 名称 描述
threadID thread 线程对象ID。 
回复数据
类型 名称 描述
整数 threadStatus 线程状态代码之一 请参见JDWP.ThreadStatus 
整数 suspendStatus 挂起状态代码之一 请参见JDWP.SuspendStatus 
错误数据
描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

ThreadGroup 命令 (5)

返回包含给定线程的线程组。
输出数据
类型 名称 描述
threadID thread 此线程的线程组。 
回复数据
类型 名称 描述
threadGroupID group 此线程的线程组。 
错误数据
描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

Frames 命令 (6)

返回暂停线程的当前调用堆栈。帧序列从当前执行的帧开始,然后是其调用者,依此类推。线程必须被暂停,返回的frameID仅在线程暂停时有效。
输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
int startFrame 要检索的第一个帧的索引。 
int length 要检索的帧数(-1表示所有剩余帧)。 
回复数据
类型 名称 描述
int frames 检索的帧数 
重复frames次:
frameID
frameID 此帧的ID。 
location
location 此帧的当前位置 
错误数据
描述
INVALID_THREAD 线程为null或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

FrameCount命令(7)

返回此线程堆栈上的帧数。线程必须被挂起,返回的计数仅在线程挂起时有效。如果未挂起,则返回JDWP.Error.errorThreadNotSuspended。
输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
回复数据
类型 名称 描述
int frameCount 此线程堆栈上的帧数。 
错误数据
描述
INVALID_THREAD 线程为null或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

OwnedMonitors命令(8)

返回已由此线程输入监视器的对象。线程必须被挂起,返回的信息仅在线程挂起时相关。需要canGetOwnedMonitorInfo功能 - 请参见 CapabilitiesNew
输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
回复数据
类型 名称 描述
int owned 拥有的监视器数量 
重复owned次:
tagged-objectID
monitor 一个拥有的监视器 
错误数据
描述
INVALID_THREAD 线程为null或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

CurrentContendedMonitor命令(9)

返回线程正在等待的对象(如果有)。线程可能正在等待进入监视器,也可能正在等待通过java.lang.Object.wait方法,等待另一个线程调用notify方法。线程必须被挂起,返回的信息仅在线程挂起时相关。需要canGetCurrentContendedMonitor功能 - 请参见 CapabilitiesNew
输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
回复数据
类型 名称 描述
tagged-objectID monitor 有争议的监视器,如果没有当前有争议的监视器,则为null。 
错误数据
描述
INVALID_THREAD 线程为null或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

Stop命令(10)

使用异步异常停止线程。

当虚拟线程在事件上被挂起时,可以使用此命令向虚拟线程发送异步异常。在其他情况下,实现可能支持向挂起的虚拟线程发送异步异常。

输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
objectID throwable 异步异常。此对象必须是java.lang.Throwable的实例或子类 
回复数据
(无)
错误数据
描述
INVALID_THREAD 线程为null、不是有效线程或线程不活动。 
THREAD_NOT_SUSPENDED 线程是虚拟线程且未被挂起。 
OPAQUE_FRAME 线程是挂起的虚拟线程,实现无法从线程的当前帧抛出异步异常。 
INVALID_OBJECT 如果线程不是已知ID或异步异常已被垃圾回收。 
VM_DEAD 虚拟机未运行。 

Interrupt命令(11)

中断线程,就像java.lang.Thread.interrupt一样。
输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
回复数据
(无)
错误数据
数值 描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

SuspendCount 命令 (12)

获取此线程的挂起计数。挂起计数是线程通过线程级或VM级挂起命令暂停的次数,而没有相应的恢复。
输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
回复数据
类型 名称 描述
int 挂起计数 此线程的未完成挂起次数。 
错误数据
数值 描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

OwnedMonitorsStackDepthInfo 命令 (13)

返回线程拥有的监视器对象,以及获取监视器的堆栈深度。如果实现无法确定堆栈深度(例如,通过JNI MonitorEnter 获取的监视器),则返回-1的堆栈深度。线程必须被挂起,返回的信息仅在线程挂起时有效。需要 canGetMonitorFrameInfo 能力 - 请参见CapabilitiesNew

自JDWP版本1.6起。

输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
回复数据
类型 名称 描述
int 拥有 拥有的监视器数量 
重复 拥有 次数:
标记对象ID
监视器 一个拥有的监视器 
int
堆栈深度 获取监视器的堆栈深度位置 
错误数据
数值 描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

ForceEarlyReturn 命令 (14)

在达到返回语句之前强制方法返回。

将提前返回的方法称为被调用方法。被调用方法是在接收此命令时指定线程的当前方法(由Java虚拟机规范中的Frames部分定义)。指定的线程必须被挂起。当在此线程上恢复Java编程语言代码的执行时,返回将发生。在发送此命令和恢复线程执行之间,堆栈的状态是未定义的。

此命令可用于在事件挂起时强制虚拟线程的当前帧返回。实现可能支持在其他情况下强制从挂起的虚拟线程的当前帧返回。

被调用方法中不再执行进一步的指令。特别地,finally块不会被执行。注意:这可能导致应用程序中的不一致状态。

通过调用被调用方法(如果它是同步方法)获取的锁以及在被调用方法内部进入同步块获取的锁将被释放。注意:这不适用于JNI锁或java.util.concurrent.locks锁。

事件,例如MethodExit,将像在正常返回时生成。

被调用方法必须是非本地Java编程语言方法。在堆栈上只有一个帧的线程上强制返回会导致在恢复时线程退出。

对于void方法,值必须是void值。对于返回基本值的方法,值的类型必须与返回类型完全匹配。对于对象值,值的类型必须有从值的类型到返回类型的扩展引用转换,并且必须加载返回类型。

自JDWP版本1.6起。需要 canForceEarlyReturn 能力 - 请参见CapabilitiesNew

输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
value 要返回的值。 
回复数据
(无)
错误数据
数值 描述
INVALID_THREAD 线程为空、不是有效线程或线程未启动。 
INVALID_OBJECT 线程或值不是已知ID。 
THREAD_NOT_SUSPENDED 如果指定线程尚未被事件挂起。 
OPAQUE_FRAME 尝试从对应于本地方法的帧中提前返回,线程是挂起的虚拟线程且目标VM无法强制其当前帧返回,或实现无法在此帧上提供此功能。 
NO_MORE_FRAMES 调用堆栈上没有更多的Java或JNI帧。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
TYPE_MISMATCH 值不是方法的返回值的适当类型。 
VM_DEAD 虚拟机未运行。 

IsVirtual 命令 (15)

确定线程是否为虚拟线程

自JDWP版本21起。

输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
回复数据
类型 名称 描述
boolean isVirtual 如果线程是虚拟线程,则为true。 
错误数据
数值 描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 线程不是已知ID。 
VM_DEAD 虚拟机未运行。 

线程组引用命令集(12)

查看 java.lang.ThreadGroup

名称命令(1)

返回线程组名称。
输出数据
类型 名称 描述
threadGroupID group 线程组对象ID。 
回复数据
类型 名称 描述
string groupName 线程组的名称。 
错误数据
描述
INVALID_THREAD_GROUP 线程组无效。 
INVALID_OBJECT 组不是已知ID。 
VM_DEAD 虚拟机未运行。 

父级命令(2)

返回包含给定线程组的任何线程组(如果有)。
输出数据
类型 名称 描述
threadGroupID group 线程组对象ID。 
回复数据
类型 名称 描述
threadGroupID parentGroup 父线程组对象,如果给定线程组是顶级线程组,则为null。 
错误数据
描述
INVALID_THREAD_GROUP 线程组无效。 
INVALID_OBJECT 组不是已知ID。 
VM_DEAD 虚拟机未运行。 

子级命令(3)

返回直接包含在此线程组中的活动平台线程和线程组。虚拟线程不包括在内。不包括子线程组中的线程和线程组。如果线程已启动且尚未终止,则线程是活动的。
输出数据
类型 名称 描述
threadGroupID group 线程组对象ID。 
回复数据
类型 名称 描述
int childThreads 活动子线程的数量。 
重复 childThreads 次:
threadID
childThread 直接子线程ID。 
int childGroups 活动子线程组的数量。 
重复 childGroups 次:
threadGroupID
childGroup 直接子线程组ID。 
错误数据
描述
INVALID_THREAD_GROUP 线程组无效。 
INVALID_OBJECT 组不是已知ID。 
VM_DEAD 虚拟机未运行。 

数组引用命令集(13)

长度命令(1)

返回给定数组中组件的数量。
输出数据
类型 名称 描述
arrayID arrayObject 数组对象ID。 
回复数据
类型 名称 描述
int arrayLength 数组的长度。 
错误数据
描述
INVALID_OBJECT arrayObject不是已知ID。 
INVALID_ARRAY 数组无效。 
VM_DEAD 虚拟机未运行。 

获取值命令(2)

返回数组组件的范围。指定的范围必须在数组的边界内。
输出数据
类型 名称 描述
arrayID arrayObject 数组对象ID。 
int firstIndex 要检索的第一个索引。 
int length 要检索的组件数量。 
回复数据
类型 名称 描述
arrayregion values 检索的值。如果值是对象,则它们是标记值;否则,它们是未标记值。 
错误数据
描述
INVALID_LENGTH 如果索引超出此数组的末尾。 
INVALID_OBJECT arrayObject不是已知ID。 
INVALID_ARRAY 数组无效。 
VM_DEAD 虚拟机未运行。 

设置值命令(3)

设置数组组件的范围。指定的范围必须在数组的边界内。对于原始值,每个值的类型必须与数组组件类型完全匹配。对于对象值,值的类型必须有从值的类型到数组组件类型的扩展引用转换,并且必须加载数组组件类型。
输出数据
类型 名称 描述
arrayID arrayObject 数组对象ID。 
int firstIndex 要设置的第一个索引。 
int values 要设置的值的数量。 
重复 values 次:
未标记的值
value 要设置的值。 
回复数据
(无)
错误数据
描述
INVALID_LENGTH 如果索引超出了数组的末尾。 
INVALID_OBJECT arrayObject 不是已知的ID。 
INVALID_ARRAY 数组无效。 
VM_DEAD 虚拟机未运行。 

ClassLoaderReference 命令集 (14)

VisibleClasses 命令 (1)

返回此类加载器可以通过名称通过 ClassLoader::loadClassClass::forName 和字节码链接找到的所有类的列表。也就是说,此类加载器已被记录为 initiating 加载器的所有类。列表包含此加载器创建的每个引用类型以及此类加载器将加载委托给另一个类加载器的任何类型。

可见类列表对于类型命名空间具有有用的属性。特定类型名称在列表中最多出现一次。由此类加载器定义的类中声明的每个字段或变量都必须解析为该单一类型。

返回的列表不保证有序。

参见 JVM TI GetClassLoaderClasses

输出数据
类型 名称 描述
classLoaderID classLoaderObject 类加载器对象ID。 
回复数据
类型 名称 描述
int classes 可见类的数量。 
重复 classes 次:
byte
refTypeTag 引用类型 的种类。 
referenceTypeID
typeID 此类加载器可见的类。 
错误数据
描述
INVALID_OBJECT 如果此引用类型已被卸载并已被垃圾回收。 
INVALID_CLASS_LOADER 类加载器无效。 
VM_DEAD 虚拟机未运行。 

EventRequest 命令集 (15)

Set 命令 (1)

设置一个事件请求。当此请求描述的事件发生时,从目标虚拟机发送一个 事件。如果发生了未请求的事件,则不会从目标虚拟机发送。两个例外是 VM 启动事件和 VM 死亡事件,它们是自动生成的事件 - 有关详细信息,请参阅 Composite Command
输出数据
类型 名称 描述
字节 eventKind 要请求的事件类型。请参阅JDWP.EventKind以获取可以请求的事件的完整列表;某些事件可能需要能力才能请求。 
字节 suspendPolicy 此事件发生时暂停哪些线程?请注意,事件和命令回复的顺序准确反映了线程暂停和恢复的顺序。例如,如果在暂停虚拟机之前处理了一个整个虚拟机的恢复,则在发生暂停虚拟机的事件之前,将回复到恢复命令将被写入传输。 
整数 modifiers 用于控制生成事件数量的约束条件。修饰符指定事件必须满足的附加测试,然后将事件放入事件队列。通过将每个修饰符按照在此集合中指定的顺序应用于事件来过滤事件,仅报告满足所有修饰符的事件。值为0表示请求中没有修饰符。

通过过滤可以显着提高调试器的性能,通过减少从目标虚拟机发送到调试器虚拟机的事件流量。 

重复modifiers次数:
字节
modKind 修饰符类型 
案例计数 - 如果modKind为1:
将请求的事件限制为在给定次数发生后最多报告一次。在到达此过滤器时,事件在前count - 1次不会报告。要请求一次性事件,请使用计数为1调用此方法。

一旦计数达到0,将应用此请求中的任何后续过滤器。如果这些过滤器中没有一个导致事件被抑制,则报告事件。否则,不会报告事件。在任一情况下,后续事件永远不会报告给此请求。此修饰符可与任何事件类型一起使用。 

整数
count 事件之前的计数。一次性为一次。 
案例条件 - 如果modKind为2:
表达式条件 
整数
exprID 用于将来 
案例仅限线程 - 如果modKind为3:
将报告的事件限制为给定线程中的事件。此修饰符可与除类卸载之外的任何事件类型一起使用。 
线程ID
thread 所需线程 
案例仅限类 - 如果modKind为4:
对于类准备事件,将此请求生成的事件限制为给定引用类型及其任何子类型的准备。对于监视器等待和等待事件,将此请求生成的事件限制为其监视器对象为给定引用类型或其任何子类型的事件。对于其他事件,将此请求生成的事件限制为其位置在给定引用类型或其任何子类型中的事件。将为可以安全转换为给定引用类型的引用类型中的任何位置生成事件。此修饰符可与除类卸载、线程启动和线程结束之外的任何事件类型一起使用。 
referenceTypeID
clazz 所需类 
案例类匹配 - 如果modKind为5:
将报告的事件限制为名称与给定受限制正则表达式匹配的类。对于类准备事件,匹配的准备类名。对于类卸载事件,匹配的卸载类名。对于监视器等待和等待事件,匹配监视器对象的类名。对于其他事件,匹配事件位置的类名。此修饰符可与除线程启动和线程结束之外的任何事件类型一起使用。 
字符串
classPattern 所需类模式。匹配仅限于给定类模式的精确匹配和以'*'开头或结尾的模式的匹配;例如,"*.Foo"或"java.*"。 
案例类排除 - 如果modKind为6:
将报告的事件限制为名称不匹配给定受限制正则表达式的类。对于类准备事件,匹配的准备类名。对于类卸载事件,匹配的卸载类名。对于监视器等待和等待事件,匹配监视器对象的类名。对于其他事件,匹配事件位置的类名。此修饰符可与除线程启动和线程结束之外的任何事件类型一起使用。 
字符串
classPattern 不允许的类模式。匹配仅限于给定类模式的精确匹配和以'*'开头或结尾的模式的匹配;例如,"*.Foo"或"java.*"。 
案例仅限位置 - 如果modKind为7:
将报告的事件限制为发生在给定位置的事件。此修饰符可与断点、字段访问、字段修改、步进和异常事件类型一起使用。 
位置
loc 所需位置 
案例仅限异常 - 如果modKind为8:
通过其类和是否捕获来限制报告的异常。此修饰符仅可与异常事件类型一起使用。 
referenceTypeID
exceptionOrNull 要报告的异常。Null(0)表示报告所有类型的异常。非空类型将报告给定类型或其任何子类型的异常事件。 
布尔值
caught 报告已捕获的异常 
布尔值
uncaught 报告未捕获的异常。请注意,有时无法确定异常在抛出时是否已捕获。有关更多信息,请参阅组合事件下的异常事件捕获位置。 
案例仅限字段 - 如果modKind为9:
将报告的事件限制为发生在给定字段的事件。此修饰符仅可与字段访问和字段修改事件类型一起使用。 
referenceTypeID
declaring 声明字段的类型。 
fieldID
fieldID 所需字段 
案例步进 - 如果modKind为10:
将报告的步进事件限制为满足深度和大小约束的事件。此修饰符仅可与步进事件类型一起使用。 
线程ID
thread 要执行步进的线程 
整数
size 每个步进的大小。请参阅JDWP.StepSize 
整数
depth 相对调用堆栈限制。请参阅JDWP.StepDepth 
案例仅限实例 - 如果modKind为11:
将报告的事件限制为其活动的'this'对象为给定对象的事件。对于静态方法,匹配值为null对象。此修饰符仅可与除类准备、类卸载、线程启动和线程结束之外的任何事件类型一起使用。引入于JDWP版本1.4。 
objectID
instance 所需'this'对象 
案例源名称匹配 - 如果modKind为12:
将报告的类准备事件限制为具有与给定受限制正则表达式匹配的源名称的引用类型。源名称由引用类型的SourceDebugExtension确定。此修饰符仅可与类准备事件一起使用。自JDWP版本1.6起。需要canUseSourceNameFilters能力 - 请参阅CapabilitiesNew。 
字符串
sourceNamePattern 所需源名称模式。匹配仅限于给定模式的精确匹配和以'*'开头或结尾的模式的匹配;例如,"*.Foo"或"java.*"。 
案例仅限平台线程 - 如果modKind为13:
对于线程启动和线程结束事件,限制事件仅发送给平台线程。

自JDWP版本21起。 

回复数据
类型 名称 描述
int requestID 创建请求的ID 
错误数据
数值 描述
INVALID_THREAD 线程为空或不是有效的线程。 
INVALID_CLASS 无效的类。 
INVALID_STRING 字符串无效。 
INVALID_OBJECT 如果此引用类型已被卸载并进行了垃圾回收。 
INVALID_COUNT 计数无效。 
INVALID_FIELDID 无效字段。 
INVALID_METHODID 无效方法。 
INVALID_LOCATION 位置无效。 
INVALID_EVENT_TYPE 指定的事件类型ID未被识别。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

清除命令(2)

清除一个事件请求。查看 JDWP.EventKind 获取可以清除的事件的完整列表。只有匹配指定事件类型和请求ID的事件请求才会被清除。如果没有匹配的事件请求,则该命令不会产生错误。自动生成的事件没有对应的事件请求,不能使用此命令清除。
输出数据
类型 名称 描述
字节 eventKind 要清除的事件类型 
整数 requestID 要清除的请求ID 
回复数据
(无)
错误数据
描述
VM_DEAD 虚拟机未运行。 
INVALID_EVENT_TYPE 指定的事件类型ID未被识别。 

ClearAllBreakpoints 命令(3)

移除所有设置的断点,如果没有设置断点,则为无操作。
输出数据
(无)
回复数据
(无)
错误数据
描述
VM_DEAD 虚拟机未运行。 

StackFrame 命令集(16)

GetValues 命令(1)

返回给定帧中一个或多个局部变量的值。每个变量必须在帧的代码索引处可见。即使局部变量信息不可用,如果前端能够确定正确的局部变量索引,则可以检索值。(通常,可以根据方法签名确定方法参数的索引,而无需访问局部变量表信息。)
输出数据
类型 名称 描述
线程ID thread 帧的线程。 
帧ID frame 帧ID。 
整数 slots 要获取的值的数量。 
重复 slots 次:
整数
slot 帧中局部变量的索引。 
字节
sigbyte 标识变量类型的 标签。 
回复数据
类型 名称 描述
整数 values 检索到的值的数量,始终等于 slots,要获取的值的数量。 
重复 values 次:
slotValue 局部变量的值。 
错误数据
描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 如果此引用类型已被卸载并进行了垃圾回收。 
INVALID_FRAMEID 无效的 jframeID。 
INVALID_SLOT 无效的槽位。 
VM_DEAD 虚拟机未运行。 

SetValues 命令(2)

设置一个或多个局部变量的值。每个变量必须在当前帧代码索引处可见。对于原始值,值的类型必须与变量的类型完全匹配。对于对象值,值的类型必须可以从值的类型到变量的类型进行扩展引用转换,并且变量的类型必须已加载。

即使局部变量信息不可用,如果前端能够确定正确的局部变量索引,则可以设置值。(通常,可以根据方法签名确定方法参数的索引,而无需访问局部变量表信息。)

如果线程是虚拟线程,则可以在线程在事件处于暂停状态时使用此命令设置顶部帧中局部变量的值。目标虚拟机可能支持在其他情况下设置局部变量的值。

输出数据
类型 名称 描述
线程ID thread 帧的线程。 
帧ID frame 帧ID。 
整数 slotValues 要设置的值的数量。 
重复 slotValues 次:
整数
slot 槽位ID。 
slotValue 要设置的值。 
回复数据
(无)
错误数据
描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 如果此引用类型已被卸载并进行了垃圾回收。 
INVALID_FRAMEID 无效的 jframeID。 
OPAQUE_FRAME 线程是暂停的虚拟线程,目标虚拟机不支持设置帧中局部变量的值。 
VM_DEAD 虚拟机未运行。 

ThisObject 命令(3)

返回此帧的 'this' 引用的值。如果帧的方法是静态的或本地的,则回复将包含空对象引用。
输出数据
类型 名称 描述
线程ID thread 帧的线程。 
帧ID frame 帧ID。 
回复数据
类型 名称 描述
标记对象ID objectThis 此帧的 'this' 对象。 
错误数据
描述
INVALID_THREAD 线程为空或不是有效线程。 
INVALID_OBJECT 如果此引用类型已被卸载并进行了垃圾回收。 
INVALID_FRAMEID 无效的 jframeID。 
VM_DEAD 虚拟机未运行。 

PopFrames 命令(4)

弹出线程堆栈的顶部帧,直到包括 'frame' 在内。线程必须暂停才能执行此命令。顶部帧将被丢弃,位于 'frame' 之前的堆栈帧将成为当前帧。操作数栈将被恢复 -- 参数值将被添加回去,如果调用不是 invokestatic,则 objectref 也将被添加回去。Java虚拟机程序计数器将恢复到调用指令的操作码。

此命令可用于在事件处于暂停状态时弹出虚拟线程的帧。实现可能支持在其他情况下弹出暂停的虚拟线程的帧。

自JDWP版本1.4起。需要 canPopFrames 能力 - 请参阅 CapabilitiesNew

输出数据
类型 名称 描述
threadID 线程 线程对象ID。 
frameID 帧ID。 
回复数据
(无)
错误数据
数值 描述
INVALID_THREAD 线程为空或不是有效的线程。 
INVALID_OBJECT 线程不是已知的ID。 
INVALID_FRAMEID 无效的jframeID。 
THREAD_NOT_SUSPENDED 如果指定的线程尚未被事件暂停。 
NO_MORE_FRAMES 调用堆栈上没有更多的Java或JNI帧。 
OPAQUE_FRAME 如果要弹出的一个或多个帧是本地方法,或其调用者是本地方法,或线程是一个已暂停的虚拟线程且实现无法弹出帧。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

ClassObjectReference 命令集 (17)

ReflectedType 命令 (1)

返回由此类对象反映的引用类型。
输出数据
类型 名称 描述
classObjectID 类对象 类对象。 
回复数据
类型 名称 描述
byte refTypeTag 以下引用类型的种类。 
referenceTypeID typeID 反映的引用类型。 
错误数据
数值 描述
INVALID_OBJECT 如果此引用类型已被卸载并已被垃圾回收。 
VM_DEAD 虚拟机未运行。 

ModuleReference 命令集 (18)

Name 命令 (1)

返回此模块的名称。

自JDWP版本9起。

输出数据
类型 名称 描述
moduleID 模块 此模块。 
回复数据
类型 名称 描述
string name 模块的名称。 
错误数据
数值 描述
INVALID_MODULE 无效的模块。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

ClassLoader 命令 (2)

返回此模块的类加载器。

自JDWP版本9起。

输出数据
类型 名称 描述
moduleID 模块 此模块。 
回复数据
类型 名称 描述
classLoaderID 类加载器 模块的类加载器。 
错误数据
数值 描述
INVALID_MODULE 无效的模块。 
NOT_IMPLEMENTED 此虚拟机中未实现该功能。 
VM_DEAD 虚拟机未运行。 

Event 命令集 (64)

Composite 命令 (100)

在目标VM中可能同时发生多个事件。例如,对于给定位置可能有多个断点请求,或者您可能单步到与断点请求相同的位置。这些事件作为复合事件一起传递。为了统一起见,即使只有一个事件要报告,也始终使用复合事件来传递事件。

在复合事件中分组的事件受以下限制:

VM启动事件和VM死亡事件是自动生成的事件。这意味着不需要使用EventRequest.Set命令请求它们。VM启动事件表示VM初始化的完成。VM死亡事件表示VM的终止。如果在自动生成事件发生时有调试器连接,它将从目标VM发送。自动生成事件也可以使用EventRequest.Set命令请求,因此当事件发生时,将从目标VM发送同一事件类型的多个事件。自动生成事件将使用事件数据集中的requestID字段设置为0。事件数据中的suspendPolicy字段的值取决于事件。对于自动生成的VM启动事件,suspendPolicy的值未定义,因此是实现或配置特定的。例如,在Sun实现中,suspendPolicy被指定为JDWP代理在启动时的选项。自动生成的VM死亡事件的suspendPolicy将设置为NONE。

事件数据
类型 名称 描述
字节 暂停策略 由此组合事件暂停的线程是哪些? 
整数 事件 集合中的事件。 
重复的 事件 次数:
字节
事件类型 事件类型选择器。 
Case VMStart - 如果 事件类型 是 JDWP.EventKind.VM_START:
通知目标虚拟机的初始化。在主线程启动之前和执行任何应用程序代码之前收到此事件。在此事件发生之前,已执行了大量系统代码并加载了许多系统类。即使未明确请求,此事件始终由目标虚拟机生成。 
整数
请求ID 生成事件的请求(如果此事件是自动生成的,则为 0。 
线程ID
线程 初始线程。 
Case SingleStep - 如果 事件类型 是 JDWP.EventKind.SINGLE_STEP:
通知目标虚拟机中步骤完成。在执行其位置处的代码之前生成步骤事件。 
整数
请求ID 生成事件的请求。 
线程ID
线程 执行步骤的线程。 
位置
位置 步骤到达的位置。 
Case Breakpoint - 如果 事件类型 是 JDWP.EventKind.BREAKPOINT:
通知目标虚拟机中的断点。在执行其位置处的代码之前生成断点事件。 
整数
请求ID 生成事件的请求。 
线程ID
线程 触发断点的线程。 
位置
位置 触发位置。 
Case MethodEntry - 如果 事件类型 是 JDWP.EventKind.METHOD_ENTRY:
通知目标虚拟机中的方法调用。在调用方法中的任何代码执行之前生成此事件。方法进入事件对于本地方法和非本地方法都会生成。

在某些虚拟机中,如果方法作为线程初始化的一部分被调用,方法进入事件可以在特定线程的线程启动事件发生之前发生。 

整数
请求ID 生成事件的请求。 
线程ID
线程 进入方法的线程。 
位置
位置 方法中的初始可执行位置。 
Case MethodExit - 如果 事件类型 是 JDWP.EventKind.METHOD_EXIT:
通知目标虚拟机中的方法返回。此事件在方法中的所有代码执行完毕后生成,但此事件的位置是方法中最后执行的位置。方法退出事件对于本地方法和非本地方法都会生成。如果方法以抛出异常终止,则不会生成方法退出事件。 
整数
请求ID 生成事件的请求。 
线程ID
线程 退出方法的线程。 
位置
位置 退出位置。 
Case MethodExitWithReturnValue - 如果 事件类型 是 JDWP.EventKind.METHOD_EXIT_WITH_RETURN_VALUE:
通知目标虚拟机中的方法返回。此事件在方法中的所有代码执行完毕后生成,但此事件的位置是方法中最后执行的位置。方法退出事件对于本地方法和非本地方法都会生成。如果方法以抛出异常终止,则不会生成方法退出事件。

自 JDWP 版本 1.6。 

整数
请求ID 生成事件的请求。 
线程ID
线程 退出方法的线程。 
位置
位置 退出位置。 
方法将返回的值。 
Case MonitorContendedEnter - 如果 事件类型 是 JDWP.EventKind.MONITOR_CONTENDED_ENTER:
通知目标虚拟机中的线程正在尝试进入已被另一个线程获取的监视器。需要 canRequestMonitorEvents 能力 - 请参阅 CapabilitiesNew

自 JDWP 版本 1.6。 

整数
请求ID 生成事件的请求。 
线程ID
线程 正在尝试进入监视器的线程。 
带标记的对象ID
对象 监视器对象引用。 
位置
位置 争用监视器进入的位置。 
Case MonitorContendedEntered - 如果 事件类型 是 JDWP.EventKind.MONITOR_CONTENDED_ENTERED:
通知目标虚拟机中的线程在等待另一个线程释放后进入监视器。需要 canRequestMonitorEvents 能力 - 请参阅 CapabilitiesNew

自 JDWP 版本 1.6。 

整数
请求ID 生成事件的请求。 
线程ID
线程 进入监视器的线程。 
带标记的对象ID
对象 监视器对象引用。 
位置
位置 争用监视器进入的位置。 
Case MonitorWait - 如果 事件类型 是 JDWP.EventKind.MONITOR_WAIT:
通知目标虚拟机中的线程即将等待监视器对象。需要 canRequestMonitorEvents 能力 - 请参阅 CapabilitiesNew

自 JDWP 版本 1.6。 

整数
请求ID 生成事件的请求。 
线程ID
线程 即将等待的线程。 
带标记的对象ID
对象 监视器对象引用。 
位置
位置 等待将发生的位置。 
长整型
超时 线程等待时间(毫秒)。 
Case MonitorWaited - 如果 事件类型 是 JDWP.EventKind.MONITOR_WAITED:
通知目标虚拟机中的线程已完成等待。需要 canRequestMonitorEvents 能力 - 请参阅 CapabilitiesNew

自 JDWP 版本 1.6。 

整数
请求ID 生成事件的请求。 
线程ID
线程 等待的线程。 
带标记的对象ID
对象 监视器对象引用。 
位置
位置 等待发生的位置。 
布尔值
超时 如果超时为真。 
Case Exception - 如果 事件类型 是 JDWP.EventKind.EXCEPTION:
通知目标虚拟机中的异常。如果异常是从非本地方法抛出的,则在抛出异常的位置生成异常事件。如果异常是从本地方法抛出的,则在抛出异常后到达的第一个非本地位置生成异常事件。 
整数
请求ID 生成事件的请求。 
线程ID
线程 具有异常的线程。 
位置
位置 异常抛出的位置(或如果从本地方法抛出,则为抛出异常后的第一个非本地位置)。 
带标记的对象ID
异常 抛出的异常。 
位置
catchLocation 捕获位置,如果未捕获则为0。如果在抛出异常时,当前位置动态地被try语句包围并处理异常,则异常被视为已捕获。(详细信息请参阅JVM规范)。如果存在这样的try语句,则捕获位置是适当catch子句中的第一个位置。

如果在异常发生时调用堆栈中存在本地方法,则有关返回的捕获位置有重要限制需要注意。在这种情况下,无法预测异常是否将由调用堆栈中的某个本地方法处理。因此,可能会有异常在此处被视为未捕获,实际上会被本地方法处理,并且不会导致目标VM的终止。此外,不能假设此处返回的捕获位置将被抛出线程到达。如果当前位置和捕获位置之间存在本地帧,则异常可能在该本地方法中处理和清除。

请注意,编译器在某些情况下可以生成try-catch块,即使在源代码中没有明确指定;例如,为synchronizedfinally块生成的代码可能包含隐式的try-catch块。如果在抛出异常时调用堆栈上存在这样的隐式生成的try-catch块,则即使从源代码的检查中看起来未捕获,异常也将被视为已捕获。 

情况ThreadStart - 如果eventKind为JDWP.EventKind.THREAD_START:
通知目标VM中新运行的线程。新线程可能是由调用java.lang.Thread.start或通过JNI将新线程附加到VM的结果。通知是由新线程在其执行开始之前的某个时间生成的。由于这个时间安排,可能在接收到此事件之前接收到线程的其他事件。(特别是,在线程初始化期间可能发生方法进入事件和方法退出事件。还可能在接收到线程启动事件之前,VirtualMachine AllThreads命令返回一个线程。)

请注意,此事件不提供有关线程对象创建的信息,该信息可能在调试的VM中发生得早得多。 

整数
requestID 生成事件的请求 
线程ID
thread 已启动的线程 
情况ThreadDeath - 如果eventKind为JDWP.EventKind.THREAD_DEATH:
通知目标VM中已完成的线程。通知是由将要终止的线程在终止之前生成的。由于这个时间安排,可能在接收到此事件后,{@link VirtualMachine#allThreads}返回此线程。

请注意,此事件不提供有关线程对象的生命周期的信息。根据被调试的VM中存在的引用,它可能很快被收集,也可能不会。 

整数
requestID 生成事件的请求 
线程ID
thread 结束的线程 
情况ClassPrepare - 如果eventKind为JDWP.EventKind.CLASS_PREPARE:
通知目标VM中的类准备。请参阅JVM规范以获取类准备的定义。对于原始类(例如,java.lang.Integer.TYPE),不会生成类准备事件。 
整数
requestID 生成事件的请求 
线程ID
thread 正在准备的线程。在极少数情况下,此事件可能发生在目标VM中的调试器系统线程中。调试器线程会采取预防措施来防止这些事件发生,但在某些情况下,特别是对于java.lang.Error的某些子类,无法避免这些事件。如果事件是由调试器系统线程生成的,则此方法返回的值为null,如果事件的请求暂停策略为EVENT_THREAD,则所有线程将被暂停,复合事件的暂停策略将反映此更改。

请注意,上述讨论不适用于目标VM在其正常(非调试)操作期间创建的系统线程。 

字节
refTypeTag 引用类型的种类。请参阅JDWP.TypeTag 
referenceTypeID
typeID 正在准备的类型 
字符串
signature 类型签名 
整数
status 类型的状态。请参阅JDWP.ClassStatus 
情况ClassUnload - 如果eventKind为JDWP.EventKind.CLASS_UNLOAD:
通知目标VM中的类卸载。

在垃圾收集期间,调试器后端存在严格的限制,因此卸载信息受到严重限制。 

整数
requestID 生成事件的请求 
字符串
signature 类型签名 
情况FieldAccess - 如果eventKind为JDWP.EventKind.FIELD_ACCESS:
通知目标VM中的字段访问。字段修改不被视为字段访问。需要canWatchFieldAccess功能 - 请参阅CapabilitiesNew
整数
requestID 生成事件的请求 
线程ID
thread 访问的线程 
位置
location 访问的位置 
字节
refTypeTag 引用类型的种类。请参阅JDWP.TypeTag 
referenceTypeID
typeID 字段的类型 
fieldID
fieldID 正在访问的字段 
tagged-objectID
object 正在访问的对象(静态字段为null=0 
情况FieldModification - 如果eventKind为JDWP.EventKind.FIELD_MODIFICATION:
通知目标VM中的字段修改。需要canWatchFieldModification功能 - 请参阅CapabilitiesNew
整数
requestID 生成事件的请求 
线程ID
thread 修改的线程 
位置
location 修改的位置 
字节
refTypeTag 引用类型的种类。请参阅JDWP.TypeTag 
referenceTypeID
typeID 字段的类型 
fieldID
fieldID 正在修改的字段 
tagged-objectID
object 正在修改的对象(静态字段为null=0 
valueToBe 将要分配的值 
情况VMDeath - 如果eventKind为JDWP.EventKind.VM_DEATH:
 
整数
requestID 生成事件的请求 

错误常量

名称 数值 描述
NONE 0 未发生错误。 
INVALID_THREAD 10 线程为空或不是有效线程。 
INVALID_THREAD_GROUP 11 线程组无效。 
INVALID_PRIORITY 12 优先级无效。 
THREAD_NOT_SUSPENDED 13 如果指定的线程尚未被事件暂停。 
THREAD_SUSPENDED 14 线程已经被暂停。 
THREAD_NOT_ALIVE 15 未使用。 
INVALID_OBJECT 20 如果此引用类型已被卸载并进行了垃圾回收。 
INVALID_CLASS 21 类无效。 
CLASS_NOT_PREPARED 22 类已加载但尚未准备好。 
INVALID_METHODID 23 方法无效。 
INVALID_LOCATION 24 位置无效。 
INVALID_FIELDID 25 字段无效。 
INVALID_FRAMEID 30 jframeID无效。 
NO_MORE_FRAMES 31 调用堆栈上没有更多的Java或JNI帧。 
OPAQUE_FRAME 32 关于帧的信息不可用(例如本地帧),或目标VM无法对线程的当前帧执行操作。 
NOT_CURRENT_FRAME 33 操作只能在当前帧上执行。 
TYPE_MISMATCH 34 变量不是所使用函数的适当类型。 
INVALID_SLOT 35 槽位无效。 
DUPLICATE 40 项目已设置。 
NOT_FOUND 41 未找到所需元素。 
INVALID_MODULE 42 模块无效。 
INVALID_MONITOR 50 监视器无效。 
NOT_MONITOR_OWNER 51 此线程不拥有监视器。 
INTERRUPT 52 调用在完成之前被中断。 
INVALID_CLASS_FORMAT 60 虚拟机尝试读取类文件并确定文件格式错误或无法解释为类文件。 
CIRCULAR_CLASS_DEFINITION 61 在初始化类时检测到循环引用。 
FAILS_VERIFICATION 62 验证器检测到类文件虽然格式正确,但包含某种内部不一致性或安全问题。 
ADD_METHOD_NOT_IMPLEMENTED 63 添加方法尚未实现。 
SCHEMA_CHANGE_NOT_IMPLEMENTED 64 模式更改尚未实现。 
INVALID_TYPESTATE 65 线程状态已修改,现在不一致。 
HIERARCHY_CHANGE_NOT_IMPLEMENTED 66 新类版本的直接超类与旧类版本不同,或直接实现的接口集不同,且canUnrestrictedlyRedefineClasses为false。 
DELETE_METHOD_NOT_IMPLEMENTED 67 新类版本未声明旧类版本中声明的方法,且canUnrestrictedlyRedefineClasses为false。 
UNSUPPORTED_VERSION 68 类文件具有此VM不支持的版本号。 
NAMES_DONT_MATCH 69 新类文件中定义的类名与旧类对象中的名称不同。 
CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED 70 新类版本具有不同的修饰符,且canUnrestrictedlyRedefineClasses为false。 
METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED 71 新类版本中的方法具有与旧类版本中对应方法不同的修饰符,且canUnrestrictedlyRedefineClasses为false。 
CLASS_ATTRIBUTE_CHANGE_NOT_IMPLEMENTED 72 新类版本具有不同的NestHost、NestMembers、PermittedSubclasses或Record类属性,且canUnrestrictedlyRedefineClasses为false。 
NOT_IMPLEMENTED 99 此虚拟机中未实现该功能。 
NULL_POINTER 100 无效指针。 
ABSENT_INFORMATION 101 所需信息不可用。 
INVALID_EVENT_TYPE 102 指定的事件类型ID未被识别。 
ILLEGAL_ARGUMENT 103 非法参数。 
OUT_OF_MEMORY 110 需要分配内存的函数,但没有更多可用于分配的内存。 
ACCESS_DENIED 111 在此虚拟机中未启用调试。无法使用JVMTI。 
VM_DEAD 112 虚拟机未运行。 
INTERNAL 113 发生意外的内部错误。 
UNATTACHED_THREAD 115 用于调用此函数的线程未附加到虚拟机。必须从附加线程进行调用。 
INVALID_TAG 500 对象类型ID或类标签。 
ALREADY_INVOKING 502 上一个调用尚未完成。 
INVALID_INDEX 503 索引无效。 
INVALID_LENGTH 504 长度无效。 
INVALID_STRING 506 字符串无效。 
INVALID_CLASS_LOADER 507 类加载器无效。 
INVALID_ARRAY 508 数组无效。 
TRANSPORT_LOAD 509 无法加载传输。 
TRANSPORT_INIT 510 无法初始化传输。 
NATIVE_METHOD 511  
INVALID_COUNT 512 计数无效。 

事件类型常量

名称 数值 描述
SINGLE_STEP 1  
BREAKPOINT 2  
FRAME_POP 3  
EXCEPTION 4  
USER_DEFINED 5  
THREAD_START 6  
THREAD_DEATH 7  
THREAD_END 7 已过时 - 在jvmdi中使用 
CLASS_PREPARE 8  
CLASS_UNLOAD 9  
CLASS_LOAD 10  
FIELD_ACCESS 20  
FIELD_MODIFICATION 21  
EXCEPTION_CATCH 30  
METHOD_ENTRY 40  
METHOD_EXIT 41  
METHOD_EXIT_WITH_RETURN_VALUE 42  
MONITOR_CONTENDED_ENTER 43  
MONITOR_CONTENDED_ENTERED 44  
MONITOR_WAIT 45  
MONITOR_WAITED 46  
VM_START 90  
VM_INIT 90 已过时 - 在jvmdi中使用 
VM_DEATH 99  
VM_DISCONNECTED 100 从未通过JDWP发送 

线程状态常量

名称 数值 描述
ZOMBIE 0 线程已终止。 
RUNNING 1 线程可运行。 
SLEEPING 2 线程正在睡眠,处于Thread.sleep状态。 
MONITOR 3 线程正在等待进入同步块/方法或在Object.wait之后等待重新进入同步块/方法。 
WAIT 4 线程正在等待,在Object.wait或LockSupport.park中。正在Thread.sleep中睡眠的虚拟线程可能具有此线程状态,而不是SLEEPING。 

暂停状态常量

名称 数值 描述
SUSPEND_STATUS_SUSPENDED 0x1  

类状态常量

名称 数值 描述
VERIFIED 1  
PREPARED 2  
INITIALIZED 4  
ERROR 8  

类型标签常量

名称 数值 描述
CLASS 1 ReferenceType是一个类。 
INTERFACE 2 ReferenceType是一个接口。 
ARRAY 3 ReferenceType是一个数组。 

标签常量

名称 数值 描述
ARRAY 91 '[' - 一个数组对象(objectID大小)。 
BYTE 66 'B' - 一个字节值(1字节)。 
CHAR 67 'C' - 一个字符值(2字节)。 
OBJECT 76 'L' - 一个对象(objectID大小)。 
FLOAT 70 'F' - 一个浮点值(4字节)。 
DOUBLE 68 'D' - 一个双精度值(8字节)。 
INT 73 'I' - 一个整数值(4字节)。 
LONG 74 'J' - 一个长整数值(8字节)。 
SHORT 83 'S' - 一个短整数值(2字节)。 
VOID 86 'V' - 一个空值(无字节)。 
BOOLEAN 90 'Z' - 一个布尔值(1字节)。 
STRING 115 's' - 一个字符串对象(objectID大小)。 
THREAD 116 't' - 一个线程对象(objectID大小)。 
THREAD_GROUP 103 'g' - 一个线程组对象(objectID大小)。 
CLASS_LOADER 108 'l' - 一个类加载器对象(objectID大小)。 
CLASS_OBJECT 99 'c' - 一个类对象对象(objectID大小)。 

步进深度常量

名称 数值 描述
INTO 0 步进到步骤结束前发生的任何方法调用中。 
OVER 1 跳过步骤结束前发生的任何方法调用。 
OUT 2 跳出当前方法。 

步进大小常量

名称 数值
名称 数值 描述
NONE 0 遇到此事件时不暂停任何线程。 
EVENT_THREAD 1 遇到此事件时暂停事件线程。 
ALL 2 遇到此事件时暂停所有线程。 

InvokeOptions 常量

调用选项是以下零个或多个位标志的组合:
名称 数值 描述
INVOKE_SINGLE_THREADED 0x01 否则,所有线程都会启动。 
INVOKE_NONVIRTUAL 0x02 否则,正常的虚拟调用(仅限实例方法)