// Run starts a debugger and exposes it with an HTTP server. The debugger // itself can be stopped with the `detach` API. Run blocks until the HTTP // server stops. func (s *ServerImpl) Run() error { var err error // Create and start the debugger if s.s.debugger, err = debugger.New(&debugger.Config{ ProcessArgs: s.s.config.ProcessArgs, AttachPid: s.s.config.AttachPid, }); err != nil { return err } rpcs := grpc.NewServer() rpcs.Register(s.s) go func() { defer s.s.listener.Close() for { c, err := s.s.listener.Accept() if err != nil { select { case <-s.s.stopChan: // We were supposed to exit, do nothing and return return default: panic(err) } } go rpcs.ServeCodec(jsonrpc.NewServerCodec(c)) if !s.s.config.AcceptMulti { break } } }() return nil }
// Run starts a debugger and exposes it with an HTTP server. The debugger // itself can be stopped with the `detach` API. Run blocks until the HTTP // server stops. func (s *ServerImpl) Run() error { var err error if s.config.APIVersion < 2 { s.config.APIVersion = 1 } if s.config.APIVersion > 2 { return fmt.Errorf("unknown API version") } // Create and start the debugger if s.debugger, err = debugger.New(&debugger.Config{ ProcessArgs: s.config.ProcessArgs, AttachPid: s.config.AttachPid, }); err != nil { return err } s.s1 = rpc1.NewServer(s.config, s.debugger) s.s2 = rpc2.NewServer(s.config, s.debugger) rpcServer := &RPCServer{s} s.methodMaps = make([]map[string]*methodType, 2) s.methodMaps[0] = map[string]*methodType{} s.methodMaps[1] = map[string]*methodType{} suitableMethods(s.s1, s.methodMaps[0]) suitableMethods(rpcServer, s.methodMaps[0]) suitableMethods(s.s2, s.methodMaps[1]) suitableMethods(rpcServer, s.methodMaps[1]) go func() { defer s.listener.Close() for { c, err := s.listener.Accept() if err != nil { select { case <-s.stopChan: // We were supposed to exit, do nothing and return return default: panic(err) } } go s.serveJSONCodec(c) if !s.config.AcceptMulti { break } } }() return nil }
// Run starts a debugger and exposes it with an HTTP server. The debugger // itself can be stopped with the `detach` API. Run blocks until the HTTP // server stops. func (s *RPCServer) Run() error { var err error // Create and start the debugger if s.debugger, err = debugger.New(&debugger.Config{ ProcessArgs: s.config.ProcessArgs, AttachPid: s.config.AttachPid, }); err != nil { return err } go func() { c, err := s.listener.Accept() if err != nil { panic(err) } rpcs := grpc.NewServer() rpcs.Register(s) rpcs.ServeCodec(jsonrpc.NewServerCodec(c)) }() return nil }