提交 eae4e99f 编写于 作者: D Derek Parker

Cleanup dwarf/frame tests

上级 8ee9525f
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
}
package frame package frame
import ( import (
"debug/elf"
"debug/gosym"
"io/ioutil"
"os"
"path/filepath" "path/filepath"
"testing" "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) { func TestFDEForPC(t *testing.T) {
fde1 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 100, end: 200}} fde1 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 100, end: 200}}
fde2 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 50, end: 99}} fde2 := &FrameDescriptionEntry{AddressRange: &addrange{begin: 50, end: 99}}
...@@ -30,16 +90,20 @@ func TestFDEForPC(t *testing.T) { ...@@ -30,16 +90,20 @@ func TestFDEForPC(t *testing.T) {
} }
func BenchmarkFDEForPC(b *testing.B) { func BenchmarkFDEForPC(b *testing.B) {
var ( f, err := os.Open("testdata/frame")
testfile, _ = filepath.Abs("../../_fixtures/testnextprog") if err != nil {
dbframe = dwarfhelper.GrabDebugFrameSection(testfile, b) b.Fatal(err)
fdes = Parse(dbframe) }
gsd = dwarfhelper.GosymData(testfile, b) 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++ { for i := 0; i < b.N; i++ {
_, _ = fdes.FDEForPC(pc) // bench worst case, exhaustive search
_, _ = fdes.FDEForPC(0x455555555)
} }
} }
package frame_test package frame_test
import ( import (
"io/ioutil"
"os"
"testing" "testing"
"github.com/davecheney/profile" "github.com/davecheney/profile"
"github.com/derekparker/dbg/dwarf/_helper"
"github.com/derekparker/dbg/dwarf/frame" "github.com/derekparker/dbg/dwarf/frame"
) )
func BenchmarkParse(b *testing.B) { func BenchmarkParse(b *testing.B) {
defer profile.Start(profile.CPUProfile).Stop() 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() b.ResetTimer()
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册