ogle: remove gosym from server
Use the newly parsed DWARF information instead.
Tested on Linux; server's Frames method still works.
LGTM=nigeltao
R=nigeltao
https://golang.org/cl/110970046
diff --git a/program/server/server.go b/program/server/server.go
index bf7150b..868a4d2 100644
--- a/program/server/server.go
+++ b/program/server/server.go
@@ -16,8 +16,6 @@
"sync"
"syscall"
- "code.google.com/p/ogle/gosym"
-
"code.google.com/p/ogle/debug/dwarf"
"code.google.com/p/ogle/debug/elf"
"code.google.com/p/ogle/debug/macho"
@@ -36,7 +34,6 @@
arch arch.Architecture
executable string // Name of executable.
dwarfData *dwarf.Data
- table *gosym.Table
mu sync.Mutex
@@ -75,7 +72,7 @@
return nil, err
}
defer fd.Close()
- architecture, dwarfData, table, err := loadExecutable(fd)
+ architecture, dwarfData, err := loadExecutable(fd)
if err != nil {
return nil, err
}
@@ -83,7 +80,6 @@
arch: *architecture,
executable: executable,
dwarfData: dwarfData,
- table: table,
fc: make(chan func() error),
ec: make(chan error),
breakpoints: make(map[uint64]breakpoint),
@@ -92,70 +88,50 @@
return srv, nil
}
-func loadExecutable(f *os.File) (*arch.Architecture, *dwarf.Data, *gosym.Table, error) {
+func loadExecutable(f *os.File) (*arch.Architecture, *dwarf.Data, error) {
// TODO: How do we detect NaCl?
if obj, err := elf.NewFile(f); err == nil {
dwarfData, err := obj.DWARF()
if err != nil {
- return nil, nil, nil, err
- }
-
- table, err := parseElf(obj)
- if err != nil {
- return nil, nil, nil, fmt.Errorf("parsing go symbol table: %v", err)
+ return nil, nil, err
}
switch obj.Machine {
case elf.EM_ARM:
- return &arch.ARM, dwarfData, table, nil
+ return &arch.ARM, dwarfData, nil
case elf.EM_386:
switch obj.Class {
case elf.ELFCLASS32:
- return &arch.X86, dwarfData, table, nil
+ return &arch.X86, dwarfData, nil
case elf.ELFCLASS64:
- return &arch.AMD64, dwarfData, table, nil
+ return &arch.AMD64, dwarfData, nil
}
case elf.EM_X86_64:
- return &arch.AMD64, dwarfData, table, nil
+ return &arch.AMD64, dwarfData, nil
}
- return nil, nil, nil, fmt.Errorf("unrecognized ELF architecture")
+ return nil, nil, fmt.Errorf("unrecognized ELF architecture")
}
if obj, err := macho.NewFile(f); err == nil {
dwarfData, err := obj.DWARF()
if err != nil {
- return nil, nil, nil, err
+ return nil, nil, err
}
/* TODO
table, err := parseMachO(obj)
if err != nil {
- return nil, nil, nil, err
+ return nil, nil, err
}
*/
switch obj.Cpu {
case macho.Cpu386:
- return &arch.X86, dwarfData, nil, nil
+ return &arch.X86, dwarfData, nil
case macho.CpuAmd64:
- return &arch.AMD64, dwarfData, nil, nil
+ return &arch.AMD64, dwarfData, nil
}
- return nil, nil, nil, fmt.Errorf("unrecognized Mach-O architecture")
+ return nil, nil, fmt.Errorf("unrecognized Mach-O architecture")
}
- return nil, nil, nil, fmt.Errorf("unrecognized binary format")
-}
-
-// parseElf returns the gosym.Table representation of the old symbol tables.
-// TODO: Delete this once we know how to get PC/SPoff data out of DWARF.
-func parseElf(f *elf.File) (*gosym.Table, error) {
- symdat, err := f.Section(".gosymtab").Data() // TODO unused.
- if err != nil {
- return nil, err
- }
- pclndat, err := f.Section(".gopclntab").Data()
- if err != nil {
- return nil, err
- }
- pcln := gosym.NewLineTable(pclndat, f.Section(".text").Addr)
- return gosym.NewTable(symdat, pcln)
+ return nil, nil, fmt.Errorf("unrecognized binary format")
}
type file struct {
@@ -500,7 +476,11 @@
// TODO: handle walking over a split stack.
for i := 0; i < req.Count; i++ {
- fp := sp + uint64(int64(s.table.PCToSPAdj(pc))) + uint64(s.arch.PointerSize)
+ fpOffset, err := s.dwarfData.PCToSPOffset(pc)
+ if err != nil {
+ return err
+ }
+ fp := sp + uint64(fpOffset)
// TODO: the returned frame should be structured instead of a hacked up string.
b.Reset()