
Fix bug involving detecting whether or not we have stepped into another function when we plan on return from the function we are currently in.
65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
package frame_test
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"path/filepath"
|
|
"syscall"
|
|
"testing"
|
|
|
|
"github.com/derekparker/dbg/_helper"
|
|
"github.com/derekparker/dbg/proctl"
|
|
)
|
|
|
|
func TestFindReturnAddress(t *testing.T) {
|
|
var testfile, _ = filepath.Abs("../../_fixtures/testnextprog")
|
|
|
|
helper.WithTestProcess(testfile, t, func(p *proctl.DebuggedProcess) {
|
|
var (
|
|
fdes = p.FrameEntries
|
|
gsd = p.GoSymTable
|
|
)
|
|
|
|
testsourcefile := testfile + ".go"
|
|
start, _, err := gsd.LineToPC(testsourcefile, 24)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
_, err = p.Break(uintptr(start))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
err = p.Continue()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
regs, err := p.Registers()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
fde, err := fdes.FDEForPC(start)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
ret := fde.ReturnAddressOffset(start)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
addr := uint64(int64(regs.Rsp) + ret)
|
|
data := make([]byte, 8)
|
|
|
|
syscall.PtracePeekText(p.Pid, uintptr(addr), data)
|
|
addr = binary.LittleEndian.Uint64(data)
|
|
|
|
expected := uint64(0x400ed3)
|
|
if addr != expected {
|
|
t.Fatalf("return address not found correctly, expected %#v got %#v", expected, addr)
|
|
}
|
|
})
|
|
}
|