func stackCommand(client service.Client, args ...string) error { var err error goroutineid := -1 depth := 10 switch len(args) { case 0: // nothing to do case 2: goroutineid, err = strconv.Atoi(args[1]) if err != nil { return fmt.Errorf("Wrong argument: expected integer") } fallthrough case 1: depth, err = strconv.Atoi(args[0]) if err != nil { return fmt.Errorf("Wrong argument: expected integer") } default: return fmt.Errorf("Wrong number of arguments to stack") } stack, err := client.Stacktrace(goroutineid, depth) if err != nil { return err } printStack(stack, "") return nil }
func stackCommand(client service.Client, args ...string) error { var ( err error goroutineid = -1 ) depth, full, err := parseStackArgs(args) if err != nil { return err } stack, err := client.Stacktrace(goroutineid, depth, full) if err != nil { return err } printStack(stack, "") return nil }
func stackCommand(client service.Client, args ...string) error { var err error goroutineid := -1 depth := 10 switch len(args) { case 0: // nothing to do case 2: goroutineid, err = strconv.Atoi(args[1]) if err != nil { return fmt.Errorf("Wrong argument: expected integer") } fallthrough case 1: depth, err = strconv.Atoi(args[0]) if err != nil { return fmt.Errorf("Wrong argument: expected integer") } default: return fmt.Errorf("Wrong number of arguments to stack") } stack, err := client.Stacktrace(goroutineid, depth) if err != nil { return err } for i := range stack { name := "(nil)" if stack[i].Function != nil { name = stack[i].Function.Name } fmt.Printf("%d. %s\n\t%s:%d (%#v)\n", i, name, stack[i].File, stack[i].Line, stack[i].PC) } return nil }
func scopePrefix(client service.Client, cmdname string, pargs ...string) error { fullargs := make([]string, 0, len(pargs)+1) fullargs = append(fullargs, cmdname) fullargs = append(fullargs, pargs...) scope := api.EvalScope{-1, 0} lastcmd := "" callFilterSortAndOutput := func(fn scopedFilteringFunc, fnargs []string) error { outfn := filterSortAndOutput(func(client service.Client, filter string) ([]string, error) { return fn(client, scope, filter) }) return outfn(client, fnargs...) } for i := 0; i < len(fullargs); i++ { lastcmd = fullargs[i] switch fullargs[i] { case "goroutine": if i+1 >= len(fullargs) { return fmt.Errorf("goroutine command needs an argument") } n, err := strconv.Atoi(fullargs[i+1]) if err != nil { return fmt.Errorf("invalid argument to goroutine, expected integer") } scope.GoroutineID = int(n) i++ case "frame": if i+1 >= len(fullargs) { return fmt.Errorf("frame command needs an argument") } n, err := strconv.Atoi(fullargs[i+1]) if err != nil { return fmt.Errorf("invalid argument to frame, expected integer") } scope.Frame = int(n) i++ case "list", "ls": frame, gid := scope.Frame, scope.GoroutineID locs, err := client.Stacktrace(gid, frame, false) if err != nil { return err } if frame >= len(locs) { return fmt.Errorf("Frame %d does not exist in goroutine %d", frame, gid) } loc := locs[frame] return printfile(loc.File, loc.Line, true) case "stack", "bt": depth, full, err := parseStackArgs(fullargs[i+1:]) if err != nil { return err } stack, err := client.Stacktrace(scope.GoroutineID, depth, full) if err != nil { return err } printStack(stack, "") return nil case "locals": return callFilterSortAndOutput(locals, fullargs[i+1:]) case "args": return callFilterSortAndOutput(args, fullargs[i+1:]) case "print", "p": return printVar(client, scope, fullargs[i+1:]...) default: return fmt.Errorf("unknown command %s", fullargs[i]) } } return fmt.Errorf("no command passed to %s", lastcmd) }