From 25783f23d68455b66a3c4038319ad99aa384eca6 Mon Sep 17 00:00:00 2001 From: Derek Parker Date: Tue, 20 May 2014 13:23:36 -0500 Subject: [PATCH] Implement Continue() for linux amd64 --- proctl/proctl_linux_amd64.go | 38 ++++++++++++++++++++++++++---------- proctl/proctl_test.go | 35 +++++++++++++++++++++++++++++---- 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/proctl/proctl_linux_amd64.go b/proctl/proctl_linux_amd64.go index 3ede7c9b..24260517 100644 --- a/proctl/proctl_linux_amd64.go +++ b/proctl/proctl_linux_amd64.go @@ -7,9 +7,10 @@ import ( ) type DebuggedProcess struct { - Pid int - Regs *syscall.PtraceRegs - Process *os.Process + Pid int + Regs *syscall.PtraceRegs + Process *os.Process + ProcessState *os.ProcessState } func NewDebugProcess(pid int) (*DebuggedProcess, error) { @@ -23,17 +24,18 @@ func NewDebugProcess(pid int) (*DebuggedProcess, error) { return nil, err } - debuggedProc := DebuggedProcess{ - Pid: pid, - Regs: &syscall.PtraceRegs{}, - Process: proc, - } - - _, err = proc.Wait() + ps, err := proc.Wait() if err != nil { return nil, err } + debuggedProc := DebuggedProcess{ + Pid: pid, + Regs: &syscall.PtraceRegs{}, + Process: proc, + ProcessState: ps, + } + return &debuggedProc, nil } @@ -59,3 +61,19 @@ func (dbp *DebuggedProcess) Step() error { return nil } + +func (dbp *DebuggedProcess) Continue() error { + err := syscall.PtraceCont(dbp.Pid, 0) + if err != nil { + return err + } + + ps, err := dbp.Process.Wait() + if err != nil { + return err + } + + dbp.ProcessState = ps + + return nil +} diff --git a/proctl/proctl_test.go b/proctl/proctl_test.go index 64e9f94b..6017b74b 100644 --- a/proctl/proctl_test.go +++ b/proctl/proctl_test.go @@ -5,23 +5,24 @@ import ( "testing" ) -func StartTestProcess() (int, error) { +func StartTestProcess() (*exec.Cmd, error) { cmd := exec.Command("../fixtures/testprog") err := cmd.Start() if err != nil { - return 0, err + return nil, err } - return cmd.Process.Pid, nil + return cmd, nil } func TestStep(t *testing.T) { - pid, err := StartTestProcess() + cmd, err := StartTestProcess() if err != nil { t.Fatal("Starting test process:", err) } + pid := cmd.Process.Pid p, err := NewDebugProcess(pid) if err != nil { t.Fatal("NewDebugProcess():", err) @@ -48,3 +49,29 @@ func TestStep(t *testing.T) { t.Errorf("Expected %#v to be greater than %#v", regs.PC(), rip) } } + +func TestContinue(t *testing.T) { + cmd, err := StartTestProcess() + if err != nil { + t.Fatal("Starting test process:", err) + } + + pid := cmd.Process.Pid + p, err := NewDebugProcess(pid) + if err != nil { + t.Fatal("NewDebugProcess():", err) + } + + if p.ProcessState.Exited() { + t.Fatal("Process already exited") + } + + err = p.Continue() + if err != nil { + t.Fatal("Continue():", err) + } + + if !p.ProcessState.Exited() { + t.Fatal("Process did not continue") + } +}