in src/main/java/com/jetbrains/jdi/ProcessAttachingConnector.java [94:152]
public VirtualMachine attach(Map<String,? extends Connector.Argument> args)
throws IOException, IllegalConnectorArgumentsException
{
String pid = argument(ARG_PID, args).value();
String t = argument(ARG_TIMEOUT, args).value();
int timeout = 0;
if (t.length() > 0) {
timeout = Integer.decode(t);
}
// Use Attach API to attach to target VM and read value of
// sun.jdwp.listenAddress property.
String address;
com.sun.tools.attach.VirtualMachine vm = null;
try {
vm = com.sun.tools.attach.VirtualMachine.attach(pid);
Properties props = vm.getAgentProperties();
address = props.getProperty("sun.jdwp.listenerAddress");
} catch (Exception x) {
throw new IOException(x);
} finally {
if (vm != null) vm.detach();
}
// check that the property value is formatted correctly
if (address == null) {
throw new IOException("Not a debuggee, or not listening for debugger to attach");
}
int pos = address.indexOf(':');
if (pos < 1) {
throw new IOException("Unable to determine transport endpoint");
}
// parse into transport library name and address
final String lib = address.substring(0, pos);
address = address.substring(pos+1);
TransportService ts = null;
if (lib.equals("dt_socket")) {
ts = new SocketTransportService();
} else {
if (lib.equals("dt_shmem")) {
try {
ts = SharedMemoryAttachingConnector.createSharedMemoryTransportService();
} catch (Exception x) { }
}
}
if (ts == null) {
throw new IOException("Transport " + lib + " not recognized");
}
// connect to the debuggee
Connection connection = ts.attach(address, timeout, 0);
return VirtualMachineManagerImpl.virtualMachineManager().createVirtualMachine(connection);
}