// State returns the current state of the debugger. func (d *Debugger) State() (*api.DebuggerState, error) { if d.process.Exited() { return nil, proc.ProcessExitedError{Pid: d.ProcessPid()} } var ( state *api.DebuggerState goroutine *api.Goroutine ) if d.process.SelectedGoroutine != nil { goroutine = api.ConvertGoroutine(d.process.SelectedGoroutine) } state = &api.DebuggerState{ SelectedGoroutine: goroutine, Exited: d.process.Exited(), } for i := range d.process.Threads { th := api.ConvertThread(d.process.Threads[i]) state.Threads = append(state.Threads, th) if i == d.process.CurrentThread.ID { state.CurrentThread = th } } return state, nil }
func (d *Debugger) State() (*api.DebuggerState, error) { if d.process.Exited() { return nil, proc.ProcessExitedError{Pid: d.ProcessPid()} } var ( state *api.DebuggerState thread *api.Thread goroutine *api.Goroutine ) if d.process.CurrentThread != nil { thread = api.ConvertThread(d.process.CurrentThread) } if d.process.SelectedGoroutine != nil { goroutine = api.ConvertGoroutine(d.process.SelectedGoroutine) } var breakpoint *api.Breakpoint bp := d.process.CurrentBreakpoint() if bp != nil { breakpoint = api.ConvertBreakpoint(bp) } state = &api.DebuggerState{ Breakpoint: breakpoint, CurrentThread: thread, SelectedGoroutine: goroutine, Exited: d.process.Exited(), } return state, nil }
func (d *Debugger) collectBreakpointInformation(state *api.DebuggerState) error { if state == nil { return nil } for i := range state.Threads { if state.Threads[i].Breakpoint == nil { continue } bp := state.Threads[i].Breakpoint bpi := &api.BreakpointInfo{} state.Threads[i].BreakpointInfo = bpi if bp.Goroutine { g, err := d.process.CurrentThread.GetG() if err != nil { return err } bpi.Goroutine = api.ConvertGoroutine(g) } if bp.Stacktrace > 0 { rawlocs, err := d.process.CurrentThread.Stacktrace(bp.Stacktrace) if err != nil { return err } bpi.Stacktrace, err = d.convertStacktrace(rawlocs, false) if err != nil { return err } } s, err := d.process.CurrentThread.Scope() if err != nil { return err } if len(bp.Variables) > 0 { bpi.Variables = make([]api.Variable, len(bp.Variables)) } for i := range bp.Variables { v, err := s.EvalVariable(bp.Variables[i]) if err != nil { return err } bpi.Variables[i] = *api.ConvertVar(v) } vars, err := s.FunctionArguments() if err == nil { bpi.Arguments = convertVars(vars) } } return nil }
func (d *Debugger) Goroutines() ([]*api.Goroutine, error) { goroutines := []*api.Goroutine{} gs, err := d.process.GoroutinesInfo() if err != nil { return nil, err } for _, g := range gs { goroutines = append(goroutines, api.ConvertGoroutine(g)) } return goroutines, err }
func (d *Debugger) collectBreakpointInformation(state *api.DebuggerState) error { if state == nil || state.Breakpoint == nil { return nil } bp := state.Breakpoint bpi := &api.BreakpointInfo{} state.BreakpointInfo = bpi if bp.Goroutine { g, err := d.process.CurrentThread.GetG() if err != nil { return err } bpi.Goroutine = api.ConvertGoroutine(g) } if bp.Stacktrace > 0 { rawlocs, err := d.process.CurrentThread.Stacktrace(bp.Stacktrace) if err != nil { return err } bpi.Stacktrace = convertStacktrace(rawlocs) } if len(bp.Variables) > 0 { bpi.Variables = make([]api.Variable, len(bp.Variables)) } for i := range bp.Variables { v, err := d.process.CurrentThread.EvalVariable(bp.Variables[i]) if err != nil { return err } bpi.Variables[i] = api.ConvertVar(v) } return nil }
func (d *Debugger) collectBreakpointInformation(state *api.DebuggerState) error { if state == nil { return nil } for i := range state.Threads { if state.Threads[i].Breakpoint == nil { continue } bp := state.Threads[i].Breakpoint bpi := &api.BreakpointInfo{} state.Threads[i].BreakpointInfo = bpi if bp.Goroutine { g, err := d.process.CurrentThread.GetG() if err != nil { return err } bpi.Goroutine = api.ConvertGoroutine(g) } if bp.Stacktrace > 0 { rawlocs, err := d.process.CurrentThread.Stacktrace(bp.Stacktrace) if err != nil { return err } bpi.Stacktrace, err = d.convertStacktrace(rawlocs, nil) if err != nil { return err } } s, err := d.process.Threads[state.Threads[i].ID].Scope() if err != nil { return err } if len(bp.Variables) > 0 { bpi.Variables = make([]api.Variable, len(bp.Variables)) } for i := range bp.Variables { v, err := s.EvalVariable(bp.Variables[i], proc.LoadConfig{true, 1, 64, 64, -1}) if err != nil { return err } bpi.Variables[i] = *api.ConvertVar(v) } if bp.LoadArgs != nil { if vars, err := s.FunctionArguments(*api.LoadConfigToProc(bp.LoadArgs)); err == nil { bpi.Arguments = convertVars(vars) } } if bp.LoadLocals != nil { if locals, err := s.LocalVariables(*api.LoadConfigToProc(bp.LoadLocals)); err == nil { bpi.Locals = convertVars(locals) } } } return nil }