From ea39719244a7c26865eda470f50b7e326c1f69b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Geisend=C3=B6rfer?= Date: Fri, 19 Aug 2022 22:07:20 +0200 Subject: [PATCH] fix pclntab example --- examples/pclnttab/darwin.go | 36 +++++++++++++++++++++++++----------- examples/pclnttab/linux.go | 33 ++++++++++++++++++++++++--------- examples/pclnttab/main.go | 35 +++++++---------------------------- 3 files changed, 56 insertions(+), 48 deletions(-) diff --git a/examples/pclnttab/darwin.go b/examples/pclnttab/darwin.go index b8896db..53af857 100644 --- a/examples/pclnttab/darwin.go +++ b/examples/pclnttab/darwin.go @@ -1,23 +1,37 @@ -//+build darwin +//go:build darwin +// +build darwin package main import ( + "debug/gosym" "debug/macho" - "errors" - "fmt" "os" ) -func gopclntab() ([]byte, error) { - file, err := macho.Open(os.Args[0]) +// from https://github.com/lizrice/debugger-from-scratch/blob/master/symbols.go +func goSymTable() (*gosym.Table, error) { + exe, err := macho.Open(os.Args[0]) if err != nil { - return nil, fmt.Errorf("elf.Open: %w", err) + return nil, nil } - for _, s := range file.Sections { - if s.Name == "__gopclntab" { - return s.Data() - } + defer exe.Close() + + addr := exe.Section("__text").Addr + + lineTableData, err := exe.Section("__gopclntab").Data() + if err != nil { + return nil, nil } - return nil, errors.New("could not find .gopclntab") + lineTable := gosym.NewLineTable(lineTableData, addr) + if err != nil { + return nil, nil + } + + symTableData, err := exe.Section("__gosymtab").Data() + if err != nil { + return nil, nil + } + + return gosym.NewTable(symTableData, lineTable) } diff --git a/examples/pclnttab/linux.go b/examples/pclnttab/linux.go index 6fd16d0..3ec31f9 100644 --- a/examples/pclnttab/linux.go +++ b/examples/pclnttab/linux.go @@ -1,4 +1,5 @@ -//+build linux +//go:build linux +// +build linux package main @@ -9,15 +10,29 @@ import ( "os" ) -func gopclntab() ([]byte, error) { - file, err := elf.Open(os.Args[0]) +// from https://github.com/lizrice/debugger-from-scratch/blob/master/symbols.go +func goSymTable() (*gosym.Table, error) { + exe, err := elf.Open(os.Args[0]) if err != nil { - return nil, fmt.Errorf("elf.Open: %w", err) + return nil, nil } - for _, s := range file.Sections { - if s.Name == ".gopclntab" { - return s.Data() - } + defer exe.Close() + + addr := exe.Section(".text").Addr + + lineTableData, err := exe.Section(".gopclntab").Data() + if err != nil { + return nil, nil } - return nil, errors.New("could not find .gopclntab") + lineTable := gosym.NewLineTable(lineTableData, addr) + if err != nil { + return nil, nil + } + + symTableData, err := exe.Section(".gosymtab").Data() + if err != nil { + return nil, nil + } + + return gosym.NewTable(symTableData, lineTable) } diff --git a/examples/pclnttab/main.go b/examples/pclnttab/main.go index 67fa8eb..6ebab2c 100644 --- a/examples/pclnttab/main.go +++ b/examples/pclnttab/main.go @@ -1,7 +1,6 @@ package main import ( - "debug/gosym" "fmt" "os" "runtime" @@ -15,22 +14,15 @@ func main() { } func run() error { - data, err := gopclntab() + symTable, err := goSymTable() if err != nil { - return fmt.Errorf("gopclntab: %w", err) + return err } - return debugSymtab(data) -} - -type StackTrace struct { - Frames []StackFrame -} - -type StackFrame struct { - PC int - Function string - File string - Line int + for _, pc := range callers() { + file, line, fn := symTable.PCToLine(uint64(pc)) + fmt.Printf("%x: %s() %s:%d\n", pc, fn.Name, file, line) + } + return nil } func callers() []uintptr { @@ -39,16 +31,3 @@ func callers() []uintptr { pcs = pcs[0:n] return pcs } - -func debugSymtab(gopclntab []byte) error { - table, err := gosym.NewTable(nil, gosym.NewLineTable(gopclntab, 0)) - if err != nil { - return fmt.Errorf("gosym.NewTable: %w", err) - } - - for _, pc := range callers() { - file, line, fn := table.PCToLine(uint64(pc)) - fmt.Printf("%x: %s() %s:%d\n", pc, fn.Name, file, line) - } - return nil -}