mirror of
https://github.com/go-delve/delve.git
synced 2025-11-03 13:57:33 +08:00
Allow arbitrary switching between threads
This commit is contained in:
@ -89,6 +89,8 @@ Once inside a debugging session, the following commands may be used:
|
|||||||
|
|
||||||
* `threads` - Print status of all traced threads.
|
* `threads` - Print status of all traced threads.
|
||||||
|
|
||||||
|
* `thread $tid` - Switch to another thread.
|
||||||
|
|
||||||
* `goroutines` - Print status of all goroutines.
|
* `goroutines` - Print status of all goroutines.
|
||||||
|
|
||||||
* `breakpoints` - Print information on all active breakpoints.
|
* `breakpoints` - Print information on all active breakpoints.
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/derekparker/delve/proctl"
|
"github.com/derekparker/delve/proctl"
|
||||||
@ -48,6 +49,7 @@ func DebugCommands() *Commands {
|
|||||||
command{aliases: []string{"step", "si"}, cmdFn: step, helpMsg: "Single step through program."},
|
command{aliases: []string{"step", "si"}, cmdFn: step, helpMsg: "Single step through program."},
|
||||||
command{aliases: []string{"next", "n"}, cmdFn: next, helpMsg: "Step over to next source line."},
|
command{aliases: []string{"next", "n"}, cmdFn: next, helpMsg: "Step over to next source line."},
|
||||||
command{aliases: []string{"threads"}, cmdFn: threads, helpMsg: "Print out info for every traced thread."},
|
command{aliases: []string{"threads"}, cmdFn: threads, helpMsg: "Print out info for every traced thread."},
|
||||||
|
command{aliases: []string{"thread", "t"}, cmdFn: thread, helpMsg: "Switch to the specified thread."},
|
||||||
command{aliases: []string{"clear"}, cmdFn: clear, helpMsg: "Deletes breakpoint."},
|
command{aliases: []string{"clear"}, cmdFn: clear, helpMsg: "Deletes breakpoint."},
|
||||||
command{aliases: []string{"goroutines"}, cmdFn: goroutines, helpMsg: "Print out info for every goroutine."},
|
command{aliases: []string{"goroutines"}, cmdFn: goroutines, helpMsg: "Print out info for every goroutine."},
|
||||||
command{aliases: []string{"breakpoints", "bp"}, cmdFn: breakpoints, helpMsg: "Print out info for active breakpoints."},
|
command{aliases: []string{"breakpoints", "bp"}, cmdFn: breakpoints, helpMsg: "Print out info for active breakpoints."},
|
||||||
@ -136,6 +138,22 @@ func threads(p *proctl.DebuggedProcess, ars ...string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func thread(p *proctl.DebuggedProcess, ars ...string) error {
|
||||||
|
oldTid := p.CurrentThread.Id
|
||||||
|
tid, err := strconv.Atoi(ars[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = p.SwitchThread(tid)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Switched from %d to %d\n", oldTid, tid)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func goroutines(p *proctl.DebuggedProcess, ars ...string) error {
|
func goroutines(p *proctl.DebuggedProcess, ars ...string) error {
|
||||||
return p.PrintGoroutinesInfo()
|
return p.PrintGoroutinesInfo()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -311,12 +311,22 @@ func (dbp *DebuggedProcess) Step() (err error) {
|
|||||||
return dbp.run(fn)
|
return dbp.run(fn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Change from current thread to the thread specified by `tid`.
|
||||||
|
func (dbp *DebuggedProcess) SwitchThread(tid int) error {
|
||||||
|
if th, ok := dbp.Threads[tid]; ok {
|
||||||
|
dbp.CurrentThread = th
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return fmt.Errorf("thread %d does not exist", tid)
|
||||||
|
}
|
||||||
|
|
||||||
// Obtains register values from what Delve considers to be the current
|
// Obtains register values from what Delve considers to be the current
|
||||||
// thread of the traced process.
|
// thread of the traced process.
|
||||||
func (dbp *DebuggedProcess) Registers() (Registers, error) {
|
func (dbp *DebuggedProcess) Registers() (Registers, error) {
|
||||||
return dbp.CurrentThread.Registers()
|
return dbp.CurrentThread.Registers()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the PC of the current thread.
|
||||||
func (dbp *DebuggedProcess) CurrentPC() (uint64, error) {
|
func (dbp *DebuggedProcess) CurrentPC() (uint64, error) {
|
||||||
return dbp.CurrentThread.CurrentPC()
|
return dbp.CurrentThread.CurrentPC()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user