void () { myClient.start(); myState = Debugger.State.RUNNING; final BreakpointManager breakpointManager = myClient.getBreakpointManager(); final Listener multicaster = myEventDispatcher.getMulticaster(); try { if (!myClient.waitForDebuggee()) { multicaster.debuggerStopped(); return; } myState = Debugger.State.SUSPENDED; do { if (myState == Debugger.State.SUSPENDED) { if (myTempBreakpoint != null) { breakpointManager.removeBreakpoint(myTempBreakpoint); myTempBreakpoint = null; } multicaster.debuggerSuspended(); } else if (myState == Debugger.State.RUNNING) { multicaster.debuggerResumed(); } else if (myState == Debugger.State.STOPPED) { break; } } while ((myState = myClient.waitForStateChange(myState)) != null); multicaster.debuggerStopped(); } catch (DebuggerStoppedException e) { multicaster.debuggerStopped(); } catch (RuntimeException e) { if (e.getCause() instanceof RemoteException) { if (e.getCause().getCause() instanceof SocketException) { multicaster.debuggerStopped(); return; } } throw e; } finally { myState = Debugger.State.STOPPED; close(); } }