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 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) }