VirtualMachine。连接可以使用多个不同的Connector对象之一进行。每个连接器封装了将调试器与目标VM连接的不同方式。
VirtualMachineManager支持将调试器连接到虚拟机的许多不同场景。下表中提供了四个示例。这些示例使用Sun实现中的命令行语法。一些Connector实现可能需要比下面介绍的稍有不同的处理。
| 场景 | 描述 |
|---|---|
| 调试器启动目标VM(最简单、最常见的场景) | 调试器调用默认连接器的LaunchingConnector.launch(java.util.Map)方法,该连接器是通过defaultConnector()获得的。目标VM被启动,并建立了该VM与调试器之间的连接。返回一个VirtualMachine镜像。
或者,为了更多控制
|
| 调试器附加到先前运行的VM |
|
| 目标VM附加到先前运行的调试器 |
|
| 目标VM启动调试器(有时称为“即时”调试) |
|
连接器在启动时创建。也就是说,它们是在第一次调用Bootstrap.virtualMachineManager()时创建的。可以通过调用VirtualMachineManager的allConnectors方法获取在启动时创建的所有连接器的列表。
如果安装在平台上,连接器将在启动时创建。此外,VirtualMachineManager还会自动创建连接器,以封装安装在平台上的任何TransportService实现。这里描述了创建连接器的这两种机制。
如果连接器安装在平台上,则必须在可见于Connector类型的定义类加载器的jar文件中安装它们,并且该jar文件包含名为Connector的提供者配置文件,位于资源目录META-INF/services中,并且提供者配置文件列出了连接器实现的完全限定类名。连接器是实现Connector接口的类。更恰当地说,该类实现特定的连接器类型之一,即AttachingConnector、ListeningConnector或LaunchingConnector。提供者配置文件的格式是每行一个完全限定类名。忽略每个类周围的空格和制表符,以及空行。注释字符是'#'(0x23),在每行上,第一个注释字符后的所有字符都将被忽略。文件必须使用UTF-8编码。
在启动时,VirtualMachineManager尝试加载和实例化(使用无参数构造函数)提供者配置文件中列出的每个类。加载或创建连接器时抛出的异常将被捕获并忽略。换句话说,尽管出现错误,启动过程仍将继续。
除了安装在平台上的连接器外,VirtualMachineManager还将创建连接器,以封装安装在平台上的任何TransportService实现。如果传输服务安装在平台上,则必须在可见于TransportService类型的定义类加载器的jar文件中安装它们,并且该jar文件包含名为TransportService的提供者配置文件,位于资源目录META-INF/services中,并且提供者配置文件列出了传输服务实现的完全限定类名。传输服务是TransportService的具体子类。提供者配置文件的格式与连接器的提供者配置文件相同,只是列出的每个类必须是实现TransportService接口的类的完全限定类名。
对于平台上安装的每个TransportService,VirtualMachineManager会创建一个对应的AttachingConnector和ListeningConnector。这些连接器被创建来封装一个Transport,而Transport又封装了TransportService。AttachingConnector的名称将基于传输服务的名称与字符串Attach连接而成。例如,如果传输服务的name()方法返回telepathic,那么AttachingConnector的名称将是telepathicAttach。类似地,ListeningConnector的名称将在传输服务的名称后面加上字符串Listen。AttachingConnector和ListeningConnector的description()方法将委托给底层传输服务的description()方法。AttachingConnector和ListeningConnector都将具有两个连接器Arguments。一个名为address的StringArgument是用于指定要连接或监听的地址的连接器参数。一个名为timeout的IntegerArgument是用于指定连接或接受时的超时的连接器参数。超时连接器可能会被忽略,具体取决于传输服务是否支持连接超时或接受超时。
如果虚拟机管理器无法创建任何连接器,即初始化失败,那么虚拟机管理器将会抛出错误,即Bootstrap.virtualMachineManager()将会失败。
- 自1.3版本开始:
- 1.3
-
Method Summary
Modifier and TypeMethodDescription返回所有已知的Connector对象的列表。返回已知的AttachingConnector对象的列表。列出所有连接到调试器的目标VM。createVirtualMachine(Connection connection) 创建一个新的虚拟机。createVirtualMachine(Connection connection, Process process) 为目标VM创建一个虚拟机镜像。标识默认连接器。返回已知的LaunchingConnector对象的列表。返回已知的ListeningConnector对象的列表。int返回JDI接口的主要版本号。int返回JDI接口的次要版本号。
-
Method Details
-
defaultConnector
LaunchingConnector defaultConnector()标识默认连接器。当不需要选择具有特定特征的连接器时,应使用此连接器作为启动连接器。- 返回:
-
默认的
LaunchingConnector
-
launchingConnectors
List<LaunchingConnector> launchingConnectors()返回已知的LaunchingConnector对象的列表。返回的任何对象都可以用于启动新的目标VM并立即为其创建一个VirtualMachine镜像。请注意,由启动连接器启动的目标VM在接收到VMStartEvent之后才能保证稳定。- 返回:
-
一个
LaunchingConnector对象的列表。
-
attachingConnectors
List<AttachingConnector> attachingConnectors()返回已知的AttachingConnector对象的列表。返回的任何对象都可以用于附加到现有目标VM并为其创建一个VirtualMachine镜像。- 返回:
-
一个
AttachingConnector对象的列表。
-
listeningConnectors
List<ListeningConnector> listeningConnectors()返回已知的ListeningConnector对象的列表。返回的任何对象都可以用于监听由目标VM发起的连接并为其创建一个VirtualMachine镜像。- 返回:
-
一个
ListeningConnector对象的列表。
-
allConnectors
返回所有已知的Connector对象的列表。- 返回:
-
一个
Connector对象的列表。
-
connectedVirtualMachines
List<VirtualMachine> connectedVirtualMachines()列出所有连接到调试器的目标VM。该列表包括由任何发起连接的目标VM和由此管理器发起连接的任何目标VM的VirtualMachine实例。目标VM将保留在此列表中,直到VM断开连接。在VM从列表中移除后,VMDisconnectEvent将放入事件队列中。- 返回:
-
一个
VirtualMachine对象的列表,每个对象都镜像一个目标VM。
-
majorInterfaceVersion
int majorInterfaceVersion()返回JDI接口的主要版本号。查看VirtualMachine.version()目标VM版本和信息以及VirtualMachine.description()更多版本信息。- 返回:
- 整数主要版本号。
-
minorInterfaceVersion
int minorInterfaceVersion()返回JDI接口的次要版本号。查看VirtualMachine.version()目标VM版本和信息以及VirtualMachine.description()更多版本信息。- 返回:
- 整数次要版本号
-
createVirtualMachine
为目标VM创建一个虚拟机镜像。为已存在
Connection的目标VM创建一个虚拟机镜像。当Connector建立连接并与目标VM成功握手时,将创建一个Connection。然后,连接器可以使用此方法创建一个虚拟机镜像,以表示目标VM的复合状态。process参数指定目标VM的Process对象。它可以指定为null。如果目标VM是由LaunchingConnector启动的,则应指定process参数,否则在创建的虚拟机上调用VirtualMachine.process()将返回null。此方法存在是为了当与目标VM建立连接时,连接器可以创建一个虚拟机镜像。只有创建新连接器实现的开发人员才需要直接使用此方法。
- 参数:
-
connection- 到目标VM的打开连接。 -
process- 如果已启动,则为目标VM的Process对象。如果未启动,则为null。 - 返回:
- 表示目标VM的新虚拟机。
- 抛出:
-
IOException- 如果发生I/O错误 -
IllegalStateException- 如果连接未打开 - 自1.5版本开始:
- 1.5
- 参见:
-
createVirtualMachine
创建一个新的虚拟机。此便利方法的工作方式类似于调用
createVirtualMachine(Connection, Process)方法,并将process参数指定为null。此方法存在是为了当与目标VM建立连接时,连接器可以创建一个虚拟机镜像。只有创建新连接器实现的开发人员才需要直接使用此方法。
- 返回:
- 新的虚拟机
- 抛出:
-
IOException- 如果发生I/O错误 -
IllegalStateException- 如果连接未打开 - 自1.5版本开始:
- 1.5
-