main.go 1.5 KB
Newer Older
D
Derek Parker 已提交
1 2 3 4 5 6
package main

import (
	"bufio"
	"fmt"
	"os"
7
	"runtime"
D
Derek Parker 已提交
8
	"strconv"
D
Derek Parker 已提交
9 10
	"strings"

D
Derek Parker 已提交
11 12
	"github.com/derekparker/dbg/command"
	"github.com/derekparker/dbg/proctl"
D
Derek Parker 已提交
13 14 15 16 17 18 19
)

type term struct {
	stdin *bufio.Reader
}

func main() {
20 21
	// We must ensure here that we are running on the same thread during
	// the execution of dbg. This is due to the fact that ptrace(2) expects
D
Derek Parker 已提交
22
	// all commands after PTRACE_ATTACH to come from the same thread.
23 24
	runtime.LockOSThread()

25 26 27 28
	var (
		t    = newTerm()
		cmds = command.DebugCommands()
	)
D
Derek Parker 已提交
29 30

	if len(os.Args) == 1 {
D
Derek Parker 已提交
31
		die("You must provide a pid\n")
D
Derek Parker 已提交
32 33 34 35
	}

	pid, err := strconv.Atoi(os.Args[1])
	if err != nil {
D
Derek Parker 已提交
36
		die(err)
D
Derek Parker 已提交
37 38 39 40
	}

	dbgproc, err := proctl.NewDebugProcess(pid)
	if err != nil {
D
Derek Parker 已提交
41
		die("Could not start debugging process:", err)
D
Derek Parker 已提交
42 43
	}

D
Derek Parker 已提交
44 45 46
	for {
		cmdstr, err := t.promptForInput()
		if err != nil {
D
Derek Parker 已提交
47
			die("Prompt for input failed.\n")
D
Derek Parker 已提交
48 49
		}

D
Derek Parker 已提交
50 51
		cmdstr, args := parseCommand(cmdstr)

D
Derek Parker 已提交
52
		cmd := cmds.Find(cmdstr)
53
		err = cmd(dbgproc, args...)
D
Derek Parker 已提交
54 55 56 57 58 59
		if err != nil {
			fmt.Fprintf(os.Stderr, "Command failed: %s\n", err)
		}
	}
}

D
Derek Parker 已提交
60
func die(args ...interface{}) {
D
Derek Parker 已提交
61 62 63 64
	fmt.Fprint(os.Stderr, args)
	os.Exit(1)
}

D
Derek Parker 已提交
65 66 67 68 69 70
func newTerm() *term {
	return &term{
		stdin: bufio.NewReader(os.Stdin),
	}
}

D
Derek Parker 已提交
71 72 73 74 75
func parseCommand(cmdstr string) (string, []string) {
	vals := strings.Split(cmdstr, " ")
	return vals[0], vals[1:]
}

D
Derek Parker 已提交
76 77 78 79 80 81 82 83
func (t *term) promptForInput() (string, error) {
	fmt.Print("dbg> ")

	line, err := t.stdin.ReadString('\n')
	if err != nil {
		return "", err
	}

D
Derek Parker 已提交
84
	return strings.TrimSuffix(line, "\n"), nil
D
Derek Parker 已提交
85
}