From fb904cc1aac0b7384ce2012d120efce5a1df8f09 Mon Sep 17 00:00:00 2001 From: Derek Parker Date: Thu, 29 May 2014 09:34:37 -0500 Subject: [PATCH] Fix bug in stepping after hitting BP --- proctl/proctl_linux_amd64.go | 7 +++++-- proctl/proctl_test.go | 11 ++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/proctl/proctl_linux_amd64.go b/proctl/proctl_linux_amd64.go index a2fa8290..bcc748ba 100644 --- a/proctl/proctl_linux_amd64.go +++ b/proctl/proctl_linux_amd64.go @@ -149,13 +149,16 @@ func (dbp *DebuggedProcess) Step() error { return err } - bp, ok := dbp.PCtoBP(regs.PC()) + bp, ok := dbp.PCtoBP(regs.PC() - 1) if ok { - err = dbp.restoreInstruction(bp.Addr, bp.OriginalData) + _, err = dbp.Clear(bp.Addr) if err != nil { return err } + // Reset instruction pointer to our restored instruction. + regs.Rip -= 1 + syscall.PtraceSetRegs(dbp.Pid, regs) } err = dbp.handleResult(syscall.PtraceSingleStep(dbp.Pid)) diff --git a/proctl/proctl_test.go b/proctl/proctl_test.go index b12b15bc..580cbee8 100644 --- a/proctl/proctl_test.go +++ b/proctl/proctl_test.go @@ -124,11 +124,12 @@ func TestBreakPoint(t *testing.T) { sleepytimefunc := p.GoSymTable.LookupFunc("main.sleepytime") sleepyaddr := sleepytimefunc.Entry - _, err = p.Break(uintptr(sleepyaddr)) + bp, err := p.Break(uintptr(sleepyaddr)) if err != nil { t.Fatal("Break():", err) } + breakpc := bp.Addr + 1 err = p.Continue() if err != nil { t.Fatal("Continue():", err) @@ -140,8 +141,8 @@ func TestBreakPoint(t *testing.T) { } pc := regs.PC() - if pc != sleepyaddr+1 { - t.Fatalf("Break not respected:\nPC:%d\nFN:%d\n", pc, sleepyaddr) + if pc != breakpc { + t.Fatalf("Break not respected:\nPC:%d\nFN:%d\n", pc, breakpc) } err = p.Step() @@ -155,8 +156,8 @@ func TestBreakPoint(t *testing.T) { } pc = regs.PC() - if pc == sleepyaddr { - t.Fatalf("Step not respected:\nPC:%d\nFN:%d\n", pc, sleepyaddr) + if pc == breakpc { + t.Fatalf("Step not respected:\nPC:%d\nFN:%d\n", pc, breakpc) } cmd.Process.Kill()