diff --git a/dwarf/_helper/helper.go b/dwarf/_helper/helper.go deleted file mode 100644 index c7aee26339111301e90f543804ae3191b031fa82..0000000000000000000000000000000000000000 --- a/dwarf/_helper/helper.go +++ /dev/null @@ -1,67 +0,0 @@ -package dwarfhelper - -import ( - "debug/elf" - "debug/gosym" - "os" - "path/filepath" - "testing" -) - -func GosymData(testfile string, t testing.TB) *gosym.Table { - f, err := os.Open(testfile) - if err != nil { - t.Fatal(err) - } - - e, err := elf.NewFile(f) - if err != nil { - t.Fatal(err) - } - - return parseGoSym(t, e) -} - -func GrabDebugFrameSection(fp string, t testing.TB) []byte { - p, err := filepath.Abs(fp) - if err != nil { - t.Fatal(err) - } - - f, err := os.Open(p) - if err != nil { - t.Fatal(err) - } - - ef, err := elf.NewFile(f) - if err != nil { - t.Fatal(err) - } - - data, err := ef.Section(".debug_frame").Data() - if err != nil { - t.Fatal(err) - } - - return data -} - -func parseGoSym(t testing.TB, exe *elf.File) *gosym.Table { - symdat, err := exe.Section(".gosymtab").Data() - if err != nil { - t.Fatal(err) - } - - pclndat, err := exe.Section(".gopclntab").Data() - if err != nil { - t.Fatal(err) - } - - pcln := gosym.NewLineTable(pclndat, exe.Section(".text").Addr) - tab, err := gosym.NewTable(symdat, pcln) - if err != nil { - t.Fatal(err) - } - - return tab -} diff --git a/dwarf/frame/frame_entries_test.go b/dwarf/frame/frame_entries_test.go index 4b83a22d54dd402621c1698bca53d8034d1a7fde..e1fa2fda724ed04e5810c438998fe7fb43e3cdd3 100644 --- a/dwarf/frame/frame_entries_test.go +++ b/dwarf/frame/frame_entries_test.go @@ -1,12 +1,72 @@ package frame import ( + "debug/elf" + "debug/gosym" + "io/ioutil" + "os" "path/filepath" "testing" - - "github.com/derekparker/dbg/dwarf/_helper" ) +func gosymData(testfile string, t testing.TB) *gosym.Table { + f, err := os.Open(testfile) + if err != nil { + t.Fatal(err) + } + + e, err := elf.NewFile(f) + if err != nil { + t.Fatal(err) + } + + return parseGoSym(t, e) +} + +func grabDebugFrameSection(fp string, t testing.TB) []byte { + p, err := filepath.Abs(fp) + if err != nil { + t.Fatal(err) + } + + f, err := os.Open(p) + if err != nil { + t.Fatal(err) + } + + ef, err := elf.NewFile(f) + if err != nil { + t.Fatal(err) + } + + data, err := ef.Section(".debug_frame").Data() + if err != nil { + t.Fatal(err) + } + + return data +} + +func parseGoSym(t testing.TB, exe *elf.File) *gosym.Table { + symdat, err := exe.Section(".gosymtab").Data() + if err != nil { + t.Fatal(err) + } + + pclndat, err := exe.Section(".gopclntab").Data() + if err != nil { + t.Fatal(err) + } + + pcln := gosym.NewLineTable(pclndat, exe.Section(".text").Addr) + tab, err := gosym.NewTable(symdat, pcln) + if err != nil { + t.Fatal(err) + } + + return tab +} + func TestFDEForPC(t *testing.T) { fde1 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 100, end: 200}} fde2 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 50, end: 99}} @@ -30,16 +90,20 @@ func TestFDEForPC(t *testing.T) { } func BenchmarkFDEForPC(b *testing.B) { - var ( - testfile, _ = filepath.Abs("../../_fixtures/testnextprog") - dbframe = dwarfhelper.GrabDebugFrameSection(testfile, b) - fdes = Parse(dbframe) - gsd = dwarfhelper.GosymData(testfile, b) - ) + f, err := os.Open("testdata/frame") + if err != nil { + b.Fatal(err) + } + defer f.Close() - pc, _, _ := gsd.LineToPC("/usr/local/go/src/pkg/runtime/memmove_amd64.s", 33) + data, err := ioutil.ReadAll(f) + if err != nil { + b.Fatal(err) + } + fdes := Parse(data) for i := 0; i < b.N; i++ { - _, _ = fdes.FDEForPC(pc) + // bench worst case, exhaustive search + _, _ = fdes.FDEForPC(0x455555555) } } diff --git a/dwarf/frame/frame_parser_test.go b/dwarf/frame/frame_parser_test.go index 9f10922072d56ffd1c6b0d1c4e602d008f295d0b..7b4c4b6df4f961cd08032cfafcddb127110e710e 100644 --- a/dwarf/frame/frame_parser_test.go +++ b/dwarf/frame/frame_parser_test.go @@ -1,16 +1,26 @@ package frame_test import ( + "io/ioutil" + "os" "testing" "github.com/davecheney/profile" - "github.com/derekparker/dbg/dwarf/_helper" "github.com/derekparker/dbg/dwarf/frame" ) func BenchmarkParse(b *testing.B) { defer profile.Start(profile.CPUProfile).Stop() - data := dwarfhelper.GrabDebugFrameSection("../../_fixtures/testprog", nil) + f, err := os.Open("testdata/frame") + if err != nil { + b.Fatal(err) + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + b.Fatal(err) + } b.ResetTimer() for i := 0; i < b.N; i++ { diff --git a/dwarf/frame/testdata/frame b/dwarf/frame/testdata/frame new file mode 100644 index 0000000000000000000000000000000000000000..a500558a794af6f1ffe315af9f1379b436d2e5ff Binary files /dev/null and b/dwarf/frame/testdata/frame differ