func traceCmd(cmd *cobra.Command, args []string) { status := func() int { const debugname = "debug" var processArgs []string if traceAttachPid == 0 { if err := gobuild(debugname); err != nil { return 1 } fp, err := filepath.Abs("./" + debugname) if err != nil { fmt.Fprintf(os.Stderr, err.Error()) return 1 } defer os.Remove(fp) processArgs = append([]string{"./" + debugname}, args...) } // Make a TCP listener listener, err := net.Listen("tcp", Addr) if err != nil { fmt.Printf("couldn't start listener: %s\n", err) return 1 } defer listener.Close() // Create and start a debug server server := rpc.NewServer(&service.Config{ Listener: listener, ProcessArgs: processArgs, AttachPid: traceAttachPid, }, Log) if err := server.Run(); err != nil { fmt.Fprintln(os.Stderr, err) return 1 } client := rpc.NewClient(listener.Addr().String()) funcs, err := client.ListFunctions(args[0]) if err != nil { fmt.Fprintln(os.Stderr, err) return 1 } for i := range funcs { _, err := client.CreateBreakpoint(&api.Breakpoint{FunctionName: funcs[i], Tracepoint: true, Line: -1, Stacktrace: traceStackDepth}) if err != nil { fmt.Fprintln(os.Stderr, err) return 1 } } cmds := terminal.DebugCommands(client) cmd := cmds.Find("continue") err = cmd(terminal.New(client, nil), "") if err != nil { fmt.Fprintln(os.Stderr, err) return 1 } return 0 }() os.Exit(status) }
func connect(addr string, conf *config.Config) int { // Create and start a terminal - attach to running instance var client service.Client client = rpc.NewClient(addr) term := terminal.New(client, conf) err, status := term.Run() if err != nil { fmt.Println(err) } return status }
func execute(attachPid int, processArgs []string, conf *config.Config) int { // Make a TCP listener listener, err := net.Listen("tcp", Addr) if err != nil { fmt.Printf("couldn't start listener: %s\n", err) return 1 } defer listener.Close() if Headless && (InitFile != "") { fmt.Fprintf(os.Stderr, "Warning: init file ignored\n") } // Create and start a debugger server server := rpc.NewServer(&service.Config{ Listener: listener, ProcessArgs: processArgs, AttachPid: attachPid, }, Log) if err := server.Run(); err != nil { fmt.Fprintln(os.Stderr, err) return 1 } var status int if !Headless { // Create and start a terminal var client service.Client client = rpc.NewClient(listener.Addr().String()) term := terminal.New(client, conf) term.InitFile = InitFile status, err = term.Run() } else { ch := make(chan os.Signal) signal.Notify(ch, sys.SIGINT) <-ch err = server.Stop(true) } if err != nil { fmt.Println(err) } return status }
func execute(attachPid int, processArgs []string, conf *config.Config, kind executeKind) int { // Make a TCP listener listener, err := net.Listen("tcp", Addr) if err != nil { fmt.Printf("couldn't start listener: %s\n", err) return 1 } defer listener.Close() if Headless && (InitFile != "") { fmt.Fprintf(os.Stderr, "Warning: init file ignored\n") } var server interface { Run() error Stop(bool) error } // Create and start a debugger server switch APIVersion { case 1, 2: server = rpccommon.NewServer(&service.Config{ Listener: listener, ProcessArgs: processArgs, AttachPid: attachPid, AcceptMulti: AcceptMulti, APIVersion: APIVersion, }, Log) default: fmt.Println("Unknown API version %d", APIVersion) return 1 } if err := server.Run(); err != nil { if err == api.NotExecutableErr { switch kind { case executingGeneratedFile: fmt.Fprintln(os.Stderr, "Can not debug non-main package") return 1 case executingExistingFile: fmt.Fprintf(os.Stderr, "%s is not executable\n", processArgs[0]) return 1 default: // fallthrough } } fmt.Fprintln(os.Stderr, err) return 1 } var status int if Headless { // Print listener address fmt.Printf("API server listening at: %s\n", listener.Addr()) ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT) <-ch err = server.Stop(true) } else { // Create and start a terminal var client service.Client client = rpc2.NewClient(listener.Addr().String()) term := terminal.New(client, conf) term.InitFile = InitFile status, err = term.Run() } if err != nil { fmt.Println(err) } return status }
func traceCmd(cmd *cobra.Command, args []string) { status := func() int { var regexp string var processArgs []string dlvArgs, targetArgs := splitArgs(cmd, args) if traceAttachPid == 0 { var pkg string switch len(dlvArgs) { case 1: regexp = args[0] case 2: pkg = args[0] regexp = args[1] } if err := gobuild(debugname, pkg); err != nil { return 1 } defer os.Remove("./" + debugname) processArgs = append([]string{"./" + debugname}, targetArgs...) } // Make a TCP listener listener, err := net.Listen("tcp", Addr) if err != nil { fmt.Printf("couldn't start listener: %s\n", err) return 1 } defer listener.Close() // Create and start a debug server server := rpccommon.NewServer(&service.Config{ Listener: listener, ProcessArgs: processArgs, AttachPid: traceAttachPid, APIVersion: 2, }, Log) if err := server.Run(); err != nil { fmt.Fprintln(os.Stderr, err) return 1 } client := rpc2.NewClient(listener.Addr().String()) funcs, err := client.ListFunctions(regexp) if err != nil { fmt.Fprintln(os.Stderr, err) return 1 } for i := range funcs { _, err = client.CreateBreakpoint(&api.Breakpoint{FunctionName: funcs[i], Tracepoint: true, Line: -1, Stacktrace: traceStackDepth, LoadArgs: &terminal.ShortLoadConfig}) if err != nil { fmt.Fprintln(os.Stderr, err) return 1 } } cmds := terminal.DebugCommands(client) t := terminal.New(client, nil) defer t.Close() err = cmds.Call("continue", "", t) if err != nil { fmt.Fprintln(os.Stderr, err) return 1 } return 0 }() os.Exit(status) }
func execute(attachPid int, processArgs []string, conf *config.Config) int { // Make a TCP listener listener, err := net.Listen("tcp", Addr) if err != nil { fmt.Printf("couldn't start listener: %s\n", err) return 1 } defer listener.Close() if Headless && (InitFile != "") { fmt.Fprintf(os.Stderr, "Warning: init file ignored\n") } var server interface { Run() error Stop(bool) error } if !Headless { ApiVersion = 2 } // Create and start a debugger server switch ApiVersion { case 1: server = rpc1.NewServer(&service.Config{ Listener: listener, ProcessArgs: processArgs, AttachPid: attachPid, AcceptMulti: AcceptMulti, }, Log) case 2: server = rpc2.NewServer(&service.Config{ Listener: listener, ProcessArgs: processArgs, AttachPid: attachPid, AcceptMulti: AcceptMulti, }, Log) default: fmt.Println("Unknown API version %d", ApiVersion) return 1 } if err := server.Run(); err != nil { fmt.Fprintln(os.Stderr, err) return 1 } var status int if Headless { // Print listener address fmt.Printf("API server listening at: %s\n", listener.Addr()) ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT) <-ch err = server.Stop(true) } else { // Create and start a terminal var client service.Client client = rpc2.NewClient(listener.Addr().String()) term := terminal.New(client, conf) term.InitFile = InitFile status, err = term.Run() } if err != nil { fmt.Println(err) } return status }