Module jdk.jdi
Package com.sun.jdi

Interface VirtualMachineManager


public interface VirtualMachineManager
连接到目标虚拟机的管理器。VirtualMachineManager允许一个应用程序调试多个目标VM。 (请注意,反之不受支持;目标VM只能由一个调试器应用程序调试。)此接口包含管理连接到远程目标VM并获取可用目标VM的VirtualMachine镜像的方法。VirtualMachine。连接可以使用多个不同的Connector对象之一进行。每个连接器封装了将调试器与目标VM连接的不同方式。

VirtualMachineManager支持将调试器连接到虚拟机的许多不同场景。下表中提供了四个示例。这些示例使用Sun实现中的命令行语法。一些Connector实现可能需要比下面介绍的稍有不同的处理。

将调试器连接到虚拟机的四种场景"
场景 描述
调试器启动目标VM(最简单、最常见的场景) 调试器调用默认连接器的LaunchingConnector.launch(java.util.Map)方法,该连接器是通过defaultConnector()获得的。目标VM被启动,并建立了该VM与调试器之间的连接。返回一个VirtualMachine镜像。

或者,为了更多控制

调试器附加到先前运行的VM
  • 使用选项-agentlib:jdwp=transport=xxx,server=y启动目标VM
  • 目标VM生成并输出特定于传输的地址,用于监听连接。
  • 启动调试器。调试器从由attachingConnectors()返回的列表中选择与名称为“xxx”的传输匹配的连接器。
  • 调试器向最终用户呈现默认连接器参数(通过Connector.defaultArguments()获得),允许用户填写目标VM生成的特定于传输的地址。
  • 调试器调用所选连接器的AttachingConnector.attach(java.util.Map)方法以附加到目标VM。返回一个VirtualMachine镜像。
目标VM附加到先前运行的调试器
目标VM启动调试器(有时称为“即时”调试)
  • 使用选项-agentlib:jdwp=launch=cmdline,onuncaught=y,transport=xxx,server=y启动目标VM
  • 稍后,在目标VM中抛出未捕获的异常。目标VM生成特定于传输的地址,用于监听调试器连接。
  • 目标VM启动调试器,将以下项目连接在一起(用空格分隔)以形成命令行:
    • launch=值
    • transport=值
    • VM正在监听调试器连接的生成的特定于传输的地址。
  • 启动时,调试器从由attachingConnectors()返回的列表中选择与名称为“xxx”的传输匹配的连接器。
  • 调试器更改默认连接器参数(通过Connector.defaultArguments()获得),以指定VM正在监听的特定传输地址。可选地,其他连接器参数可以呈现给用户。
  • 调试器调用所选连接器的AttachingConnector.attach(java.util.Map)方法以附加到目标VM。返回一个VirtualMachine镜像。

连接器在启动时创建。也就是说,它们是在第一次调用Bootstrap.virtualMachineManager()时创建的。可以通过调用VirtualMachineManager的allConnectors方法获取在启动时创建的所有连接器的列表。

如果安装在平台上,连接器将在启动时创建。此外,VirtualMachineManager还会自动创建连接器,以封装安装在平台上的任何TransportService实现。这里描述了创建连接器的这两种机制。

如果连接器安装在平台上,则必须在可见于Connector类型的定义类加载器的jar文件中安装它们,并且该jar文件包含名为Connector的提供者配置文件,位于资源目录META-INF/services中,并且提供者配置文件列出了连接器实现的完全限定类名。连接器是实现Connector接口的类。更恰当地说,该类实现特定的连接器类型之一,即AttachingConnectorListeningConnectorLaunchingConnector。提供者配置文件的格式是每行一个完全限定类名。忽略每个类周围的空格和制表符,以及空行。注释字符是'#'0x23),在每行上,第一个注释字符后的所有字符都将被忽略。文件必须使用UTF-8编码。

在启动时,VirtualMachineManager尝试加载和实例化(使用无参数构造函数)提供者配置文件中列出的每个类。加载或创建连接器时抛出的异常将被捕获并忽略。换句话说,尽管出现错误,启动过程仍将继续。

除了安装在平台上的连接器外,VirtualMachineManager还将创建连接器,以封装安装在平台上的任何TransportService实现。如果传输服务安装在平台上,则必须在可见于TransportService类型的定义类加载器的jar文件中安装它们,并且该jar文件包含名为TransportService的提供者配置文件,位于资源目录META-INF/services中,并且提供者配置文件列出了传输服务实现的完全限定类名。传输服务是TransportService的具体子类。提供者配置文件的格式与连接器的提供者配置文件相同,只是列出的每个类必须是实现TransportService接口的类的完全限定类名。

对于平台上安装的每个TransportService,VirtualMachineManager会创建一个对应的AttachingConnectorListeningConnector。这些连接器被创建来封装一个Transport,而Transport又封装了TransportService。AttachingConnector的名称将基于传输服务的名称与字符串Attach连接而成。例如,如果传输服务的name()方法返回telepathic,那么AttachingConnector的名称将是telepathicAttach。类似地,ListeningConnector的名称将在传输服务的名称后面加上字符串Listen。AttachingConnector和ListeningConnector的description()方法将委托给底层传输服务的description()方法。AttachingConnector和ListeningConnector都将具有两个连接器Arguments。一个名为addressStringArgument是用于指定要连接或监听的地址的连接器参数。一个名为timeoutIntegerArgument是用于指定连接或接受时的超时的连接器参数。超时连接器可能会被忽略,具体取决于传输服务是否支持连接超时或接受超时。

如果虚拟机管理器无法创建任何连接器,即初始化失败,那么虚拟机管理器将会抛出错误,即Bootstrap.virtualMachineManager()将会失败。

自1.3版本开始:
1.3
  • 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

      List<Connector> 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

      VirtualMachine createVirtualMachine(Connection connection, Process process) throws IOException
      为目标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

      VirtualMachine createVirtualMachine(Connection connection) throws IOException
      创建一个新的虚拟机。

      此便利方法的工作方式类似于调用createVirtualMachine(Connection, Process)方法,并将process参数指定为null

      此方法存在是为了当与目标VM建立连接时,连接器可以创建一个虚拟机镜像。只有创建新连接器实现的开发人员才需要直接使用此方法。

      返回:
      新的虚拟机
      抛出:
      IOException - 如果发生I/O错误
      IllegalStateException - 如果连接未打开
      自1.5版本开始:
      1.5