模块  jdk.jdi
软件包  com.sun.jdi

Interface VirtualMachineManager


  • public interface VirtualMachineManager
    与目标虚拟机的连接管理器。 VirtualMachineManager允许一个应用程序调试多个目标VM。 (请注意,不支持converse;目标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安装在对Connector类型的定义类加载器可见的jar文件中,并且该jar文件在资源目录META-INF/services包含名为Connector的提供程序配置文件,并且提供程序配置文件列出Connector实现的完全限定类名。 Connector是实现Connector接口的类。 更适当地该类实现的特定连接器类型中的一种,即AttachingConnectorListeningConnector ,或LaunchingConnector 提供程序配置文件的格式是每行一个完全限定的类名。 每个类周围的空格和制表符以及空行都将被忽略。 注释字符为'#'0x23 ),并且在每一行上忽略第一个注释字符后面的所有字符。 该文件必须以UTF-8编码。

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

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

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

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

    从以下版本开始:
    1.3