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
-