Refactor: Modify command registraion on bootup

Benefits of this CL:

* Commands no longer rely on closured proc struct
* No two-step process for basic command initializaion
This commit is contained in:
Derek Parker
2014-06-25 14:58:45 -05:00
parent feec416b1a
commit 7fe2037ff1
3 changed files with 110 additions and 116 deletions

92
main.go
View File

@ -2,10 +2,8 @@ package main
import (
"bufio"
"debug/gosym"
"fmt"
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
@ -24,7 +22,10 @@ func main() {
// all commands after PTRACE_ATTACH to come from the same thread.
runtime.LockOSThread()
t := newTerm()
var (
t = newTerm()
cmds = command.DebugCommands()
)
if len(os.Args) == 1 {
die("You must provide a pid\n")
@ -40,9 +41,6 @@ func main() {
die("Could not start debugging process:", err)
}
cmds := command.DebugCommands()
registerProcessCommands(cmds, dbgproc)
for {
cmdstr, err := t.promptForInput()
if err != nil {
@ -52,7 +50,7 @@ func main() {
cmdstr, args := parseCommand(cmdstr)
cmd := cmds.Find(cmdstr)
err = cmd(args...)
err = cmd(dbgproc, args...)
if err != nil {
fmt.Fprintf(os.Stderr, "Command failed: %s\n", err)
}
@ -64,86 +62,6 @@ func die(args ...interface{}) {
os.Exit(1)
}
func registerProcessCommands(cmds *command.Commands, proc *proctl.DebuggedProcess) {
cmds.Register("continue", command.CommandFunc(proc.Continue))
cmds.Register("step", func(args ...string) error {
err := proc.Step()
if err != nil {
return err
}
regs, err := proc.Registers()
if err != nil {
return err
}
f, l, _ := proc.GoSymTable.PCToLine(regs.PC())
fmt.Printf("Stopped at: %s:%d\n", f, l)
return nil
})
cmds.Register("clear", func(args ...string) error {
fname := args[0]
fn := proc.GoSymTable.LookupFunc(fname)
if fn == nil {
return fmt.Errorf("No function named %s", fname)
}
bp, err := proc.Clear(fn.Entry)
if err != nil {
return err
}
fmt.Printf("Breakpoint cleared at %#v for %s %s:%d\n", bp.Addr, bp.FunctionName, bp.File, bp.Line)
return nil
})
cmds.Register("break", func(args ...string) error {
var (
fn *gosym.Func
pc uint64
fname = args[0]
)
if strings.ContainsRune(fname, ':') {
fl := strings.Split(fname, ":")
f, err := filepath.Abs(fl[0])
if err != nil {
return err
}
l, err := strconv.Atoi(fl[1])
if err != nil {
return err
}
pc, fn, err = proc.GoSymTable.LineToPC(f, l)
if err != nil {
return err
}
} else {
fn = proc.GoSymTable.LookupFunc(fname)
pc = fn.Entry
}
if fn == nil {
return fmt.Errorf("No function named %s", fname)
}
bp, err := proc.Break(uintptr(pc))
if err != nil {
return err
}
fmt.Printf("Breakpoint set at %#v for %s %s:%d\n", bp.Addr, bp.FunctionName, bp.File, bp.Line)
return nil
})
}
func newTerm() *term {
return &term{
stdin: bufio.NewReader(os.Stdin),