func withTestTerminal(name string, t testing.TB, fn func(*FakeTerminal)) { os.Setenv("TERM", "dumb") listener, err := net.Listen("tcp", "localhost:0") if err != nil { t.Fatalf("couldn't start listener: %s\n", err) } defer listener.Close() server := rpccommon.NewServer(&service.Config{ Listener: listener, ProcessArgs: []string{test.BuildFixture(name).Path}, }, false) if err := server.Run(); err != nil { t.Fatal(err) } client := rpc2.NewClient(listener.Addr().String()) defer func() { client.Detach(true) }() ft := &FakeTerminal{ t: t, Term: New(client, nil), } fn(ft) }
func Test1Restart_attachPid(t *testing.T) { // Assert it does not work and returns error. // We cannot restart a process we did not spawn. server := rpccommon.NewServer(&service.Config{ Listener: nil, AttachPid: 999, }, false) if err := server.Restart(); err == nil { t.Fatal("expected error on restart after attaching to pid but got none") } }
func Test1RunWithInvalidPath(t *testing.T) { listener, err := net.Listen("tcp", "localhost:0") if err != nil { t.Fatalf("couldn't start listener: %s\n", err) } defer listener.Close() server := rpccommon.NewServer(&service.Config{ Listener: listener, ProcessArgs: []string{"invalid_path"}, }, false) if err := server.Run(); err == nil { t.Fatal("Expected Run to return error for invalid program path") } }
func withTestClient1(name string, t *testing.T, fn func(c *rpc1.RPCClient)) { listener, err := net.Listen("tcp", "localhost:0") if err != nil { t.Fatalf("couldn't start listener: %s\n", err) } defer listener.Close() server := rpccommon.NewServer(&service.Config{ Listener: listener, ProcessArgs: []string{protest.BuildFixture(name).Path}, }, false) if err := server.Run(); err != nil { t.Fatal(err) } client := rpc1.NewClient(listener.Addr().String()) defer func() { client.Detach(true) }() fn(client) }
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) }