?
This document uses PHP Chinese website manual Release
import "debug/gosym"
概述
參數(shù)
gosym 包可以訪問(wèn)由 gc 編譯器生成的 Go 二進(jìn)制文件中嵌入的 Go 符號(hào)和行號(hào)表。
type DecodingError
func (e *DecodingError) Error() string
type Func
type LineTable
func NewLineTable(data []byte, text uint64) *LineTable
func (t *LineTable) LineToPC(line int, maxpc uint64) uint64
func (t *LineTable) PCToLine(pc uint64) int
type Obj
type Sym
func (s *Sym) BaseName() string
func (s *Sym) PackageName() string
func (s *Sym) ReceiverName() string
func (s *Sym) Static() bool
type Table
func NewTable(symtab []byte, pcln *LineTable) (*Table, error)
func (t *Table) LineToPC(file string, line int) (pc uint64, fn *Func, err error)
func (t *Table) LookupFunc(name string) *Func
func (t *Table) LookupSym(name string) *Sym
func (t *Table) PCToFunc(pc uint64) *Func
func (t *Table) PCToLine(pc uint64) (file string, line int, fn *Func)
func (t *Table) SymByAddr(addr uint64) *Sym
type UnknownFileError
func (e UnknownFileError) Error() string
type UnknownLineError
func (e *UnknownLineError) Error() string
pclntab.go symtab.go
DecodingError表示解碼符號(hào)表時(shí)發(fā)生錯(cuò)誤。
type DecodingError struct { // 包含過(guò)濾或未導(dǎo)出的字段}
func (e *DecodingError) Error() string
Func 收集有關(guān)單個(gè)功能的信息。
type Func struct { Entry uint64 *Sym End uint64 Params []*Sym Locals []*Sym FrameSize int LineTable *LineTable Obj *Obj}
LineTable 是一個(gè)數(shù)據(jù)結(jié)構(gòu)映射程序計(jì)數(shù)器到行號(hào)。
在 Go 1.1 及更早版本中,每個(gè)函數(shù)(由 Func 表示)都有自己的 LineTable,并且行號(hào)對(duì)應(yīng)于程序中所有源文件行中所有文件的編號(hào)。絕對(duì)行號(hào)將不得不單獨(dú)轉(zhuǎn)換為文件內(nèi)的文件名和行號(hào)。
在 Go 1.2 中,數(shù)據(jù)的格式發(fā)生了變化,因此整個(gè)程序都有一個(gè) LineTable,由所有 Funcs 共享,并且沒(méi)有絕對(duì)行號(hào),只有特定文件中的行號(hào)。
大多數(shù)情況下,LineTable 的方法應(yīng)該被視為包的內(nèi)部細(xì)節(jié); 調(diào)用者應(yīng)該使用 Table 上的方法。
type LineTable struct { Data []byte PC uint64 Line int // 包含過(guò)濾或未導(dǎo)出的字段}
func NewLineTable(data []byte, text uint64) *LineTable
NewLineTable 返回與編碼數(shù)據(jù)對(duì)應(yīng)的新PC/line 表。文本必須是相應(yīng)文本段的起始地址。
func (t *LineTable) LineToPC(line int, maxpc uint64) uint64
LineToPC 返回給定行號(hào)的程序計(jì)數(shù)器,只考慮maxpc 之前的程序計(jì)數(shù)器。調(diào)用者應(yīng)該使用 Table 的 LineToPC 方法。
func (t *LineTable) PCToLine(pc uint64) int
PCToLine 返回給定程序計(jì)數(shù)器的行號(hào)。調(diào)用者應(yīng)該使用 Table 的 PCToLine 方法。
Obj 表示符號(hào)表中的函數(shù)集合。
將二進(jìn)制分割成單獨(dú)的 Objs 的確切方法是符號(hào)表格式的內(nèi)部細(xì)節(jié)。
在Go的早期版本中,每個(gè)源文件都變成了不同的 Obj。
在Go 1和Go 1.1中,每個(gè)軟件包為所有 Go 源和每個(gè)C源文件創(chuàng)建一個(gè) Obj。
在Go 1.2中,整個(gè)程序都有一個(gè)Obj。
type Obj struct { // Funcs是Obj中的函數(shù)列表。 Funcs []Func // 在Go 1.1和更早版本中,路徑是相應(yīng)符號(hào)的列表 // 到產(chǎn)生Obj的源文件名。 // 在Go 1.2中,Paths是零。 // 使用Table.Files的鍵獲取源文件列表。 Paths []Sym // 元(meta)}
Sym代表一個(gè)符號(hào)表項(xiàng)。
type Sym struct { Value uint64 Type byte Name string GoType uint64 // 如果此符號(hào)是函數(shù)符號(hào),則對(duì)應(yīng)Func Func *Func}
func (s *Sym) BaseName() string
BaseName返回沒(méi)有包名或接收者名稱的符號(hào)名稱。
func (s *Sym) PackageName() string
PackageName 返回符號(hào)名稱的包部分,如果沒(méi)有則返回空字符串。
func (s *Sym) ReceiverName() string
ReceiverName 返回此符號(hào)的接收器類型名稱,如果沒(méi)有,則返回空字符串。
func (s *Sym) Static() bool
靜態(tài)報(bào)告此符號(hào)是否為靜態(tài)(在其文件外部不可見(jiàn))。
表格代表一個(gè) Go 符號(hào)表。它存儲(chǔ)從程序解碼的所有符號(hào),并提供在符號(hào),名稱和地址之間進(jìn)行轉(zhuǎn)換的方法。
type Table struct { Syms []Sym Funcs []Func Files map[string]*Obj // 無(wú)論是Go 1.2還是更高版本的二進(jìn)制文件 Objs []Obj // 無(wú)論是Go 1.2還是更高版本的二進(jìn)制文件 // 包含過(guò)濾或未導(dǎo)出的字段}
func NewTable(symtab []byte, pcln *LineTable) (*Table, error)
NewTable 對(duì)數(shù)據(jù)中的 Go 符號(hào)表進(jìn)行解碼,返回一個(gè)內(nèi)存中表示。
func (t *Table) LineToPC(file string, line int) (pc uint64, fn *Func, err error)
LineToPC 在指定文件的給定行中查找第一個(gè)程序計(jì)數(shù)器。如果查找此行時(shí)發(fā)生錯(cuò)誤,它將返回 UnknownPathError 或 UnknownLineError。
func (t *Table) LookupFunc(name string) *Func
LookupFunc 返回給定名稱的文本,數(shù)據(jù)或 bss 符號(hào),如果沒(méi)有找到這樣的符號(hào),則返回 nil。
func (t *Table) LookupSym(name string) *Sym
LookupSym 返回給定名稱的文本,數(shù)據(jù)或 bss 符號(hào),如果沒(méi)有找到這樣的符號(hào),則返回 nil。
func (t *Table) PCToFunc(pc uint64) *Func
PCToFunc 返回包含程序計(jì)數(shù)器 pc 的函數(shù),如果沒(méi)有這種函數(shù),則返回 nil。
func (t *Table) PCToLine(pc uint64) (file string, line int, fn *Func)
PCToLine 查找程序計(jì)數(shù)器的行號(hào)信息。如果沒(méi)有信息,則返回 fn == nil。
func (t *Table) SymByAddr(addr uint64) *Sym
SymByAddr 返回從給定地址開(kāi)始的文本,數(shù)據(jù)或 bss 符號(hào)。
UnknownFileError 表示找不到符號(hào)表中的特定文件。
type UnknownFileError string
func (e UnknownFileError) Error() string
UnknownLineError 表示無(wú)法將行映射到程序計(jì)數(shù)器,因?yàn)樾谐隽宋募慕缦藁蛘咭驗(yàn)榻o定行上沒(méi)有代碼。
type UnknownLineError struct { File string Line int}
func (e *UnknownLineError) Error() string