func findLocationHelper(t *testing.T, c service.Client, loc string, shouldErr bool, count int, checkAddr uint64) []uint64 { locs, err := c.FindLocation(api.EvalScope{-1, 0}, loc) t.Logf("FindLocation(\"%s\") → %v\n", loc, locs) if shouldErr { if err == nil { t.Fatalf("Resolving location <%s> didn't return an error: %v", loc, locs) } } else { if err != nil { t.Fatalf("Error resolving location <%s>: %v", loc, err) } } if (count >= 0) && (len(locs) != count) { t.Fatalf("Wrong number of breakpoints returned for location <%s> (got %d, expected %d)", loc, len(locs), count) } if checkAddr != 0 && checkAddr != locs[0].PC { t.Fatalf("Wrong address returned for location <%s> (got %v, epected %v)", loc, locs[0].PC, checkAddr) } addrs := make([]uint64, len(locs)) for i := range locs { addrs[i] = locs[i].PC } return addrs }
func setBreakpoint(client service.Client, tracepoint bool, args ...string) error { if len(args) < 1 { return fmt.Errorf("address required, specify either a function name or <file:line>") } requestedBp := &api.Breakpoint{} for i := 1; i < len(args); i++ { switch args[i] { case "-stack": i++ n, err := strconv.Atoi(args[i]) if err != nil { return fmt.Errorf("argument of -stack must be a number") } requestedBp.Stacktrace = n case "-goroutine": requestedBp.Goroutine = true default: requestedBp.Variables = append(requestedBp.Variables, args[i]) } } requestedBp.Tracepoint = tracepoint locs, err := client.FindLocation(args[0]) if err != nil { return err } thing := "Breakpoint" if tracepoint { thing = "Tracepoint" } for _, loc := range locs { requestedBp.Addr = loc.PC bp, err := client.CreateBreakpoint(requestedBp) if err != nil { return err } fmt.Printf("%s %d set at %#v for %s %s:%d\n", thing, bp.ID, bp.Addr, bp.FunctionName, bp.File, bp.Line) } return nil }
func listCommand(client service.Client, args ...string) error { if len(args) == 0 { state, err := client.GetState() if err != nil { return err } printcontext(state) return nil } locs, err := client.FindLocation(api.EvalScope{-1, 0}, args[0]) if err != nil { return err } if len(locs) > 1 { return debugger.AmbiguousLocationError{Location: args[0], CandidatesLocation: locs} } printfile(locs[0].File, locs[0].Line, false) return nil }