anchor.diff:        var name = frames[idx]["functionName"];
         assert(name != null);
         if (name != functionNames[i]) {
  -        debugger.error("call frame $idx: "
  +        debugger.error("Error: call frame $idx: "
             "expected function name '${functionNames[i]}' but found '$name'");
           return;
         }
  
positive.code:         print("Debuggee isolate id ${msg["params"]["id"]} shut down.");
          shutdownEventSeen = true;
          if (!script.isEmpty) {
            error("Premature isolate shutdown event seen.");
          }
        }
      } else if (msg["event"] == "breakpointResolved") {
  
negative.code:         var trace = getAttachedStackTrace(e);
          if (trace != null) msg += "\nStackTrace: $trace";
          error(msg);
          cleanup();
        });
    }
  
    void cleanup() {
      if (cleanupDone) return;
      if (socket != null) {
        socket.close().catchError((error) {
          // Print this directly in addition to adding it to the
          // error message queue, in case the error message queue
          // gets printed before this error handler is called.
          print("Error occurred while closing socket: $error");
          error("Error while closing socket: $error");
        });
      }
      targetProcess.kill();
      // If the process was already dead exitCode is already
      // available and we call exit() in the next event loop cycle.
      // Otherwise this will wait for the process to exit.
      targetProcess.exitCode.then((exitCode) {
        if (errorsDetected) {
          print("\n===== Errors detected: =====");
          for (int i = 0; i < errors.length; i++) print(errors[i]);
          print("============================\n");
        }
        exit(errors.length);
      });
      cleanupDone = true;
    }
  }
  
  