mirror of
https://github.com/go-delve/delve.git
synced 2025-10-29 01:27:16 +08:00
proc,debugger,terminal: read goroutine ancestors
Add options to the stack command to read the goroutine ancestors. Ancestor tracking was added to Go 1.12 with CL: https://go-review.googlesource.com/c/go/+/70993/ Implements #1491
This commit is contained in:
committed by
Alessandro Arzilli
parent
48f1f51ef9
commit
9826531597
@ -947,6 +947,48 @@ func (d *Debugger) Stacktrace(goroutineID, depth int, readDefers bool, cfg *proc
|
||||
return d.convertStacktrace(rawlocs, cfg)
|
||||
}
|
||||
|
||||
// Ancestors returns the stacktraces for the ancestors of a goroutine.
|
||||
func (d *Debugger) Ancestors(goroutineID, numAncestors, depth int) ([]api.Ancestor, error) {
|
||||
d.processMutex.Lock()
|
||||
defer d.processMutex.Unlock()
|
||||
|
||||
if _, err := d.target.Valid(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
g, err := proc.FindGoroutine(d.target, goroutineID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if g == nil {
|
||||
return nil, errors.New("no selected goroutine")
|
||||
}
|
||||
|
||||
ancestors, err := g.Ancestors(numAncestors)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
r := make([]api.Ancestor, len(ancestors))
|
||||
for i := range ancestors {
|
||||
r[i].ID = ancestors[i].ID
|
||||
if ancestors[i].Unreadable != nil {
|
||||
r[i].Unreadable = ancestors[i].Unreadable.Error()
|
||||
continue
|
||||
}
|
||||
frames, err := ancestors[i].Stack(depth)
|
||||
if err != nil {
|
||||
r[i].Unreadable = fmt.Sprintf("could not read ancestor stacktrace: %v", err)
|
||||
continue
|
||||
}
|
||||
r[i].Stack, err = d.convertStacktrace(frames, nil)
|
||||
if err != nil {
|
||||
r[i].Unreadable = fmt.Sprintf("could not read ancestor stacktrace: %v", err)
|
||||
}
|
||||
}
|
||||
return r, nil
|
||||
}
|
||||
|
||||
func (d *Debugger) convertStacktrace(rawlocs []proc.Stackframe, cfg *proc.LoadConfig) ([]api.Stackframe, error) {
|
||||
locations := make([]api.Stackframe, 0, len(rawlocs))
|
||||
for i := range rawlocs {
|
||||
|
||||
Reference in New Issue
Block a user