delve/dwarf/frame/table_test.go
Derek Parker 58c1f54578 Improve Next implementation
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.
2014-10-13 19:04:38 -05:00

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)
}
})
}