delve/dwarf/frame/table_test.go

65 lines
1.2 KiB
Go
Raw Normal View History

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) {
2014-09-12 20:19:36 +00:00
var testfile, _ = filepath.Abs("../../_fixtures/testnextprog")
helper.WithTestProcess(testfile, t, func(p *proctl.DebuggedProcess) {
2014-09-12 20:19:36 +00:00
var (
fdes = p.FrameEntries
gsd = p.GoSymTable
2014-09-12 20:19:36 +00:00
)
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)
}
2014-06-29 16:52:30 +00:00
fde, err := fdes.FDEForPC(start)
if err != nil {
t.Fatal(err)
}
ret := fde.ReturnAddressOffset(start)
if err != nil {
t.Fatal(err)
}
2014-06-29 16:52:30 +00:00
addr := uint64(int64(regs.Rsp) + ret)
data := make([]byte, 8)
syscall.PtracePeekText(p.Pid, uintptr(addr), data)
addr = binary.LittleEndian.Uint64(data)
expected := uint64(0x400ed4)
2014-10-10 20:53:30 +00:00
if addr != expected {
t.Fatalf("return address not found correctly, expected %#v got %#v", expected, addr)
}
})
}