Connections can be made using one of several different {@link com.sun.jdi.connect.Connector} objects. Each connector encapsulatesa different way of connecting the debugger with a target VM.
The VirtualMachineManager supports many different scenarios for connecting a debugger to a virtual machine. Four examples are presented in the table below. The examples use the command line syntax in Sun's implementation. Some {@link com.sun.jdi.connect.Connector} implementations may require slightlydifferent handling than presented below.
Scenario | Description |
---|---|
Debugger launches target VM (simplest, most-common scenario) | Debugger calls the {@link com.sun.jdi.connect.LaunchingConnector#launch(java.util.Map)}method of the default connector, obtained with {@link #defaultConnector}. The target VM is launched, and a connection between that VM and the debugger is established. A {@link VirtualMachine} mirror is returned. Or, for more control
|
Debugger attaches to previously-running VM |
|
Target VM attaches to previously-running debugger | -agentlib:jdwp=transport=xxx,address=yyy where "xxx" the transport for one of the connectors selected by the the debugger and "yyy" is the address generated by {@link com.sun.jdi.connect.ListeningConnector#accept(java.util.Map)} for thattransport. |
Target VM launches debugger (sometimes called "Just-In-Time" debugging) | -agentlib:jdwp=launch=cmdline,onuncaught=y,transport=xxx,server=y
|
Connectors are created at start-up time. That is, they are created the first time that {@link com.sun.jdi.Bootstrap#virtualMachineManager()} is invoked.The list of all Connectors created at start-up time can be obtained from the VirtualMachineManager by invoking the {@link #allConnectors allConnectors} method.
Connectors are created at start-up time if they are installed on the platform. In addition, Connectors are created automatically by the VirtualMachineManager to encapsulate any {@link com.sun.jdi.connect.spi.TransportService} implementationsthat are installed on the platform. These two mechanisms for creating Connectors are described here.
A Connector is installed on the platform if it is installed in a jar file that is visible to the defining class loader of the {@link com.sun.jdi.connect.Connector} type,and that jar file contains a provider configuration file named com.sun.jdi.connect.Connector in the resource directory META-INF/services, and the provider configuration file lists the full-qualified class name of the Connector implementation. A Connector is a class that implements the {@link com.sun.jdi.connect.Connector Connector} interface. Moreappropriately the class implements one of the specific Connector types, namely {@link com.sun.jdi.connect.AttachingConnector AttachingConnector}, {@link com.sun.jdi.connect.ListeningConnector ListeningConnector}, or {@link com.sun.jdi.connect.LaunchingConnector LaunchingConnector}. The format of the provider configuration file is one fully-qualified class name per line. Space and tab characters surrounding each class, as well as blank lines are ignored. The comment character is '#' (0x23), and on each line all characters following the first comment character are ignored. The file must be encoded in UTF-8.
At start-up time the VirtualMachineManager attempts to load and instantiate (using the no-arg constructor) each class listed in the provider configuration file. Exceptions thrown when loading or creating the Connector are caught and ignored. In other words, the start-up process continues despite of errors.
In addition to Connectors installed on the platform the VirtualMachineManager will also create Connectors to encapsulate any {@link com.sun.jdi.connect.spi.TransportService} implementationsthat are installed on the platform. A TransportService is installed on the platform if it installed in a jar file that is visible to the defining class loader for the {@link com.sun.jdi.connect.spi.TransportService} type, and that jarfile contains a provider configuration file named com.sun.jdi.connect.spi.TransportService in the resource directory META-INF/services, and the provider configuration file lists the the full-qualified class name of the TransportService implementation. A TransportService is a concrete sub-class of {@link com.sun.jdi.connect.spi.TransportService TransportService}. The format of the provider configuration file is the same as the provider configuration file for Connectors except that each class listed must be the fully-qualified class name of a class that implements the TransportService interface.
For each TransportService installed on the platform, the VirtualMachineManager creates a corresponding {@link com.sun.jdi.connect.AttachingConnector} and{@link com.sun.jdi.connect.ListeningConnector}. These Connectors are created to encapsulate a {@link com.sun.jdi.connect.Transport Transport} that in turnencapsulates the TransportService. The AttachingConnector will be named based on the name of the transport service concatenated with the string Attach. For example, if the transport service {@link com.sun.jdi.connect.spi.TransportService#name() name()} methodreturns telepathic then the AttachingConnector will be named telepathicAttach. Similiarly the ListeningConnector will be named with the string Listen tagged onto the name of the transport service. The {@link com.sun.jdi.connect.Connector#description() description()} methodof both the AttachingConnector, and the ListeningConnector, will delegate to the {@link com.sun.jdi.connect.spi.TransportService#description() description()} method of the underlying transport service. Boththe AttachingConnector and the ListeningConnector will have two Connector {@link com.sun.jdi.connect.Connector$Argument Arguments}. A {@link com.sun.jdi.connect.Connector$StringArgument StringArgument}named address is the connector argument to specify the address to attach too, or to listen on. A {@link com.sun.jdi.connect.Connector$IntegerArgument IntegerArgument}named timeout is the connector argument to specify the timeout when attaching, or accepting. The timeout connector may be ignored depending on if the transport service supports an attach timeout or accept timeout.
Initialization of the virtual machine manager will fail, that is {@link com.sun.jdi.Bootstrap#virtualMachineManager()} will throw anerror if the virtual machine manager is unable to create any connectors. @author Gordon Hirsch @since 1.3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|