Module  jdk.jdi
软件包  com.sun.jdi

Interface VirtualMachineManager



  • public interface VirtualMachineManager
    目标虚拟机的连接经理。 VirtualMachineManager允许一个应用程序调试多个目标虚拟机。 (请注意,不支持相反;目标VM只能由一个调试器应用程序进行调试。)此接口包含管理与远程目标VM的连接的方法,并获取可用目标VM的VirtualMachine镜像。

    可以使用几个不同的Connector对象之一进行连接。 每个连接器封装了将调试器与目标VM连接的不同方式。

    VirtualMachineManager支持将调试器连接到虚拟机的许多不同方案。 下表列出了四个例子。 这些示例在Sun的实现中使用命令行语法。 一些Connector实现可能需要略微不同的处理,如下所示。

    Four scenarios for connecting a debugger to a virtual machine" Scenario Description Debugger launches target VM (simplest, most-common scenario) Debugger calls the LaunchingConnector.launch(java.util.Map) method of the default connector, obtained with defaultConnector(). The target VM is launched, and a connection between that VM and the debugger is established. A VirtualMachine mirror is returned.

    Or, for more control

    Debugger attaches to previously-running VM
    • Target VM is launched using the options -agentlib:jdwp=transport=xxx,server=y
    • Target VM generates and outputs the tranport-specific address at which it will listen for a connection.
    • Debugger is launched. Debugger selects a connector in the list returned by attachingConnectors() matching the transport with the name "xxx".
    • Debugger presents the default connector parameters (obtained through Connector.defaultArguments()) to the end user, allowing the user to fill in the transport-specific address generated by the target VM.
    • Debugger calls the AttachingConnector.attach(java.util.Map) method of the selected to attach to the target VM. A VirtualMachine mirror is returned.
    Target VM attaches to previously-running debugger Target VM launches debugger (sometimes called "Just-In-Time" debugging)
    • Target VM is launched with the options -agentlib:jdwp=launch=cmdline,onuncaught=y,transport=xxx,server=y
    • Later, an uncaught exception is thrown in the target VM. The target VM generates the tranport-specific address at which it will listen for a connection.
    • Target VM launches the debugger with the following items concatenated together (separated by spaces) to form the command line:
      • The launch= value
      • The transport= value
      • The generated transport-specific address at which VM is listening for debugger connection.
    • Upon launch, debugger selects a connector in the list returned by attachingConnectors() matching the transport with the name "xxx".
    • Debugger changes the default connector parameters (obtained through Connector.defaultArguments()) to specify the transport specific address at which the VM is listenig. Optionally, other connector arguments can be presented to the user.
    • Debugger calls the AttachingConnector.attach(java.util.Map) method of the selected to attach to the target VM. A VirtualMachine mirror is returned.

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

    连接器在启动时创建,如果它们安装在平台上。 此外,由VirtualMachineManager自动创建连接器以封装平台上安装的任何TransportService实现。 这两种机制用于创建连接器。

    如果连接器安装在Connector类型的定义类加载器中可见的jar文件中,并且该jar文件包含资源目录META-INF/services名为com.sun.jdi.connect.Connector的提供程序配置文件,以及提供程序配置文件列出Connector实现的全限定类名。 连接器是实现Connector接口的类。 更适当地该类实现的特定连接器类型中的一种,即AttachingConnectorListeningConnector ,或LaunchingConnector 提供程序配置文件的格式是每行一个完全限定的类名。 每个类周围的空格和制表符字符以及空白行都被忽略。 注释字符为'#'0x23 ),并且在每行上,忽略第一个注释字符之后的所有字符。 文件必须以UTF-8编码。

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

    除了安装在平台上的连接器之外,VirtualMachineManager还将创建连接器来封装平台上安装的任何TransportService实现。 如果安装在适用于TransportService类型的定义类加载器的jar文件中,则该平台上将安装TransportService ,该jar文件包含资源目录META-INF/services名为com.sun.jdi.connect.spi.TransportService的提供程序配置文件,并且提供程序配置文件列表TransportService实施的全限定类名。 TransportService是TransportService的具体子类。 提供程序配置文件的格式与“连接器”的提供程序配置文件相同,除了列出的每个类都必须是实现TransportService接口的类的完全限定类名称。

    对于安装在平台上的每个TransportService,VirtualMachineManager将创建相应的AttachingConnectorListeningConnector 这些连接器被创建来封装一个Transport ,这又封装了TransportService。 Attach将根据连接字符串Attach的传输服务的名称进行命名。 例如,如果传输服务name()方法返回telepathictelepathic将被命名为telepathicAttach 类似的ListeningConnector将被命名为Listen标记到传输服务名称的字符串。 AttachedConnector和ListeningConnector的description()方法将委托给基础传输服务的description()方法。 AttachedConnector和ListeningConnector都将有两个连接器Arguments 一个StringArgument命名为address是连接参数指定的地址过于重视,还是要听的。 IntegerArgument命名timeout是该连接器的参数时附接,或接受来指定超时。 根据传输服务是否支持附加超时或接受超时,超时连接器可能会被忽略。

    虚拟机管理器的初始化将失败,如果虚拟机管理器无法创建任何连接器,则将发生错误Bootstrap.virtualMachineManager()

    从以下版本开始:
    1.3
    • 方法详细信息

      • defaultConnector

        LaunchingConnector defaultConnector​()
        标识默认连接器。 当不需要选择具有特定特性的连接器时,该连接器应用作发射连接器。
        结果
        默认为LaunchingConnector
      • connectedVirtualMachines

        List<VirtualMachine> connectedVirtualMachines​()
        列出连接到调试器的所有目标虚拟机。 该列表包括发起连接的任何目标虚拟机的VirtualMachine实例以及此管理器已启动连接的任何目标虚拟机。 目标VM将保留在此列表中,直到VM断开连接。 在将VM从列表中删除后,将将VMDisconnectEvent置于事件队列中。
        结果
        一个VirtualMachine对象的列表,每个镜像一个目标虚拟机。
      • createVirtualMachine

        VirtualMachine createVirtualMachine​(Connection connection,
                                            Process process)
                                     throws IOException
        为目标虚拟机创建虚拟机镜像。

        为已存在Connection的目标虚拟机创建虚拟机镜像。 Connector建立连接并与目标VM成功握手时,将创建连接。 然后,连接器可以使用此方法创建虚拟机镜像来表示目标VM的复合状态。

        process参数指定标签虚拟机的Process对象。 可以指定为null 如果目标虚拟机由LaunchingConnector启动,则应指定process参数,否则,在创建的虚拟机上调用VirtualMachine.process()将返回null

        存在此方法,以便连接器可以在建立与目标VM的连接时创建虚拟机镜像。 只有开发新的Connector实现的开发者才需要直接使用这种方法。

        参数
        connection - 与目标虚拟机的打开连接。
        process - 如果启动, 则为目标VM的Process对象。 null如果没有启动。
        结果
        代表目标虚拟机的新虚拟机。
        异常
        IOException - 如果发生I / O错误
        IllegalStateException - 如果连接未打开
        从以下版本开始:
        1.5
        另请参见:
        Connection.isOpen()VirtualMachine.process()
      • createVirtualMachine

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

        这种方便的方法就像调用createVirtualMachine(Connection, Process)方法一样,并指定null作为process参数。

        存在此方法,以便连接器可以在建立与目标VM的连接时创建虚拟机镜像。 只有开发新的Connector实现的开发者才需要直接使用这种方法。

        结果
        新的虚拟机
        异常
        IOException - 如果发生I / O错误
        IllegalStateException - 如果连接未打开
        从以下版本开始:
        1.5