public void start() {
    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();
    }
  }
public void start()