diff --git a/cmd/dlv/main.go b/cmd/dlv/main.go index e26689ff0ccd3400e0dbce572ecd8b74814f5092..f9df662667a3b539bb4ec80451b9e6864c2e51ce 100644 --- a/cmd/dlv/main.go +++ b/cmd/dlv/main.go @@ -3,11 +3,13 @@ package main import ( "flag" "fmt" + sys "golang.org/x/sys/unix" "io/ioutil" "log" "net" "os" "os/exec" + "os/signal" "path/filepath" "strconv" @@ -36,10 +38,12 @@ func main() { var printv, printhelp bool var addr string var logEnabled bool + var headless bool flag.BoolVar(&printv, "version", false, "Print version number and exit.") flag.StringVar(&addr, "addr", "localhost:0", "Debugging server listen address.") flag.BoolVar(&logEnabled, "log", false, "Enable debugging server logging.") + flag.BoolVar(&headless, "headless", false, "Run in headless mode.") flag.Parse() if flag.NFlag() == 0 && len(flag.Args()) == 0 { @@ -120,15 +124,22 @@ func main() { }) go server.Run() - // Create and start a terminal - client := rest.NewClient(listener.Addr().String()) - term := terminal.New(client) - err, status := term.Run() + status := 0 + if !headless { + // Create and start a terminal + client := rest.NewClient(listener.Addr().String()) + term := terminal.New(client) + err, status = term.Run() + } else { + ch := make(chan os.Signal) + signal.Notify(ch, sys.SIGINT) + <-ch + err = server.Stop(true) + } + if err != nil { fmt.Println(err) } - - // Clean up and exit fmt.Println("[Hope I was of service hunting your bug!]") os.Exit(status) } diff --git a/service/rest/server.go b/service/rest/server.go index 761e1a2b60494b0becd6525dd25656105088df31..0c32c429972173cc7ee2cceebfc626d063705390 100644 --- a/service/rest/server.go +++ b/service/rest/server.go @@ -98,8 +98,13 @@ func (s *RESTServer) Run() error { return http.Serve(s.listener, container) } +// Stop detaches from the debugger and waits for it to stop. func (s *RESTServer) Stop(kill bool) error { - return s.debugger.Detach(kill) + err := s.debugger.Detach(kill) + if err != nil { + return err + } + return <-s.debuggerStopped } // writeError writes a simple error response. @@ -117,17 +122,12 @@ func (s *RESTServer) detach(request *restful.Request, response *restful.Response return } - err = s.debugger.Detach(kill) + err = s.Stop(kill) if err != nil { writeError(response, http.StatusInternalServerError, err.Error()) return } - err = <-s.debuggerStopped - if err != nil { - writeError(response, http.StatusInternalServerError, err.Error()) - return - } response.WriteHeader(http.StatusOK) }