func goroutine(client service.Client, args ...string) error { switch len(args) { case 0: return printscope(client) case 1: gid, err := strconv.Atoi(args[0]) if err != nil { return err } oldState, err := client.GetState() if err != nil { return err } newState, err := client.SwitchGoroutine(gid) if err != nil { return err } fmt.Printf("Switched from %d to %d (thread %d)\n", oldState.SelectedGoroutine.ID, gid, newState.CurrentThread.ID) return nil default: return scopePrefix(client, "goroutine", args...) } }
func thread(client service.Client, args ...string) error { if len(args) == 0 { return fmt.Errorf("you must specify a thread") } tid, err := strconv.Atoi(args[0]) if err != nil { return err } oldState, err := client.GetState() if err != nil { return err } newState, err := client.SwitchThread(tid) if err != nil { return err } oldThread := "<none>" newThread := "<none>" if oldState.CurrentThread != nil { oldThread = strconv.Itoa(oldState.CurrentThread.ID) } if newState.CurrentThread != nil { newThread = strconv.Itoa(newState.CurrentThread.ID) } fmt.Printf("Switched from %s to %s\n", oldThread, newThread) return nil }
func threads(client service.Client, args ...string) error { threads, err := client.ListThreads() if err != nil { return err } state, err := client.GetState() if err != nil { return err } sort.Sort(byThreadID(threads)) for _, th := range threads { prefix := " " if state.CurrentThread != nil && state.CurrentThread.ID == th.ID { prefix = "* " } if th.Function != nil { fmt.Printf("%sThread %d at %#v %s:%d %s\n", prefix, th.ID, th.PC, shortenFilePath(th.File), th.Line, th.Function.Name) } else { fmt.Printf("%sThread %s\n", prefix, formatThread(th)) } } return nil }
func printscope(client service.Client) error { state, err := client.GetState() if err != nil { return err } fmt.Printf("Thread %s\nGoroutine %s\n", formatThread(state.CurrentThread), formatGoroutine(state.SelectedGoroutine)) return nil }
func goroutines(client service.Client, args ...string) error { state, err := client.GetState() if err != nil { return err } gs, err := client.ListGoroutines() if err != nil { return err } fmt.Printf("[%d goroutines]\n", len(gs)) for _, g := range gs { prefix := " " if g.ID == state.SelectedGoroutine.ID { prefix = "* " } fmt.Printf("%sGoroutine %s\n", prefix, formatGoroutine(g)) } 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 }