©
本文档使用
php.cn手册 发布
import "debug/dwarf"
概述
参数
Package dwarf 提供对从可执行文件加载的 DWARF调试信息的访问,这些信息在 DWARF 2.0 标准中定义,http://dwarfstd.org/doc/dwarf-2.0.0.pdf
Variables (变量)
type AddrType
type ArrayType
func (t *ArrayType) Size() int64
func (t *ArrayType) String() string
type Attr
func (a Attr) GoString() string
func (a Attr) String() string
type BasicType
func (b *BasicType) Basic() *BasicType
func (t *BasicType) String() string
type BoolType
type CharType
type Class
func (i Class) GoString() string
func (i Class) String() string
type CommonType
func (c *CommonType) Common() *CommonType
func (c *CommonType) Size() int64
type ComplexType
type Data
func New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, error)
func (d *Data) AddTypes(name string, types []byte) error
func (d *Data) LineReader(cu *Entry) (*LineReader, error)
func (d *Data) Ranges(e *Entry) ([][2]uint64, error)
func (d *Data) Reader() *Reader
func (d *Data) Type(off Offset) (Type, error)
type DecodeError
func (e DecodeError) Error() string
type DotDotDotType
func (t *DotDotDotType) String() string
type Entry
func (e *Entry) AttrField(a Attr) *Field
func (e *Entry) Val(a Attr) interface{}
type EnumType
func (t *EnumType) String() string
type EnumValue
type Field
type FloatType
type FuncType
func (t *FuncType) String() string
type IntType
type LineEntry
type LineFile
type LineReader
func (r *LineReader) Next(entry *LineEntry) error
func (r *LineReader) Reset()
func (r *LineReader) Seek(pos LineReaderPos)
func (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error
func (r *LineReader) Tell() LineReaderPos
type LineReaderPos
type Offset
type PtrType
func (t *PtrType) String() string
type QualType
func (t *QualType) Size() int64
func (t *QualType) String() string
type Reader
func (r *Reader) AddressSize() int
func (r *Reader) Next() (*Entry, error)
func (r *Reader) Seek(off Offset)
func (r *Reader) SeekPC(pc uint64) (*Entry, error)
func (r *Reader) SkipChildren()
type StructField
type StructType
func (t *StructType) Defn() string
func (t *StructType) String() string
type Tag
func (t Tag) GoString() string
func (t Tag) String() string
type Type
type TypedefType
func (t *TypedefType) Size() int64
func (t *TypedefType) String() string
type UcharType
type UintType
type UnspecifiedType
type VoidType
func (t *VoidType) String() string
buf.go class_string.go const.go entry.go line.go open.go type.go typeunit.go unit.go
ErrUnknownPC 是 LineReader.ScanPC 在查找 PC未被行表中的任何条目覆盖时返回的错误。
var ErrUnknownPC = errors.New("ErrUnknownPC")
AddrType 代表机器地址类型。
type AddrType struct { BasicType}
ArrayType表示固定大小的数组类型。
type ArrayType struct { CommonType Type Type StrideBitSize int64 // 如果> 0,则保持每个元素的位数 Count int64 // 如果== -1,一个不完整的数组,如char x []。}
func (t *ArrayType) Size() int64
func (t *ArrayType) String() string
Attr 在 DWARF 条目字段中标识属性类型。
type Attr uint32
const ( AttrSibling Attr = 0x01 AttrLocation Attr = 0x02 AttrName Attr = 0x03 AttrOrdering Attr = 0x09 AttrByteSize Attr = 0x0B AttrBitOffset Attr = 0x0C AttrBitSize Attr = 0x0D AttrStmtList Attr = 0x10 AttrLowpc Attr = 0x11 AttrHighpc Attr = 0x12 AttrLanguage Attr = 0x13 AttrDiscr Attr = 0x15 AttrDiscrValue Attr = 0x16 AttrVisibility Attr = 0x17 AttrImport Attr = 0x18 AttrStringLength Attr = 0x19 AttrCommonRef Attr = 0x1A AttrCompDir Attr = 0x1B AttrConstValue Attr = 0x1C AttrContainingType Attr = 0x1D AttrDefaultValue Attr = 0x1E AttrInline Attr = 0x20 AttrIsOptional Attr = 0x21 AttrLowerBound Attr = 0x22 AttrProducer Attr = 0x25 AttrPrototyped Attr = 0x27 AttrReturnAddr Attr = 0x2A AttrStartScope Attr = 0x2C AttrStrideSize Attr = 0x2E AttrUpperBound Attr = 0x2F AttrAbstractOrigin Attr = 0x31 AttrAccessibility Attr = 0x32 AttrAddrClass Attr = 0x33 AttrArtificial Attr = 0x34 AttrBaseTypes Attr = 0x35 AttrCalling Attr = 0x36 AttrCount Attr = 0x37 AttrDataMemberLoc Attr = 0x38 AttrDeclColumn Attr = 0x39 AttrDeclFile Attr = 0x3A AttrDeclLine Attr = 0x3B AttrDeclaration Attr = 0x3C AttrDiscrList Attr = 0x3D AttrEncoding Attr = 0x3E AttrExternal Attr = 0x3F AttrFrameBase Attr = 0x40 AttrFriend Attr = 0x41 AttrIdentifierCase Attr = 0x42 AttrMacroInfo Attr = 0x43 AttrNamelistItem Attr = 0x44 AttrPriority Attr = 0x45 AttrSegment Attr = 0x46 AttrSpecification Attr = 0x47 AttrStaticLink Attr = 0x48 AttrType Attr = 0x49 AttrUseLocation Attr = 0x4A AttrVarParam Attr = 0x4B AttrVirtuality Attr = 0x4C AttrVtableElemLoc Attr = 0x4D AttrAllocated Attr = 0x4E AttrAssociated Attr = 0x4F AttrDataLocation Attr = 0x50 AttrStride Attr = 0x51 AttrEntrypc Attr = 0x52 AttrUseUTF8 Attr = 0x53 AttrExtension Attr = 0x54 AttrRanges Attr = 0x55 AttrTrampoline Attr = 0x56 AttrCallColumn Attr = 0x57 AttrCallFile Attr = 0x58 AttrCallLine Attr = 0x59 AttrDescription Attr = 0x5A)
func (a Attr) GoString() string
func (a Attr) String() string
BasicType 保存所有基本类型通用的字段。
type BasicType struct { CommonType BitSize int64 BitOffset int64}
func (b *BasicType) Basic() *BasicType
func (t *BasicType) String() string
BoolType表示 Bool类型。
type BoolType struct { BasicType}
CharType 表示有符号的字符类型。
type CharType struct { BasicType}
Class 是属性值的DWARF 4类。
通常,给定属性的值可能采用 DWARF 定义的几个可能的类之一,每个类都会导致对该属性的稍微不同的解释。
DWARF 第4版比以前版本的 DWARF 更精细地区分属性值类。读者可以将早期版本的 DWAR F中较粗糙的类混淆到适当的D WARF 4类中。例如, DWARF 2对常量以及所有类型的部分偏移使用“constant”,但读者将规范DWARF 2文件中的属性,这些属性指向某个类 *Ptr 类的部分偏移,尽管这些类只是在 DWARF 3 中定义。
type Class int
const ( // ClassUnknown表示未知的DWARF类的值。 ClassUnknown Class = iota // ClassAddress表示类型为uint64的值 // 目标机器上的地址。 // ClassBlock表示其类型为[]bype的值 // 解释取决于属性。 ClassBlock // ClassConstant表示类型为int64的值 // 常量。 这个常数的解释取决于 // 属性。 ClassConstant // ClassExprLoc表示包含的[]字节的值 // 一个编码的DWARF表达式或位置描述。 ClassExprLoc // ClassFlag表示bool类型的值。 ClassFlag // ClassLinePtr表示值为int64的偏移量 // 进入“line”部分。 ClassLinePtr // ClassLocListPtr表示值为int64的偏移量 // 到“loclist”部分。 ClassLocListPtr // ClassMacPtr表示int64偏移量的值 // “mac”部分。 ClassMacPtr // ClassMacPtr表示int64偏移量的值 // “rangelist”部分。 ClassRangeListPtr // ClassReference表示偏移量偏移量的值 // 信息部分中的条目(用于Reader.Seek)。 // DWARF规范结合了ClassReference和 // ClassReferenceSig入类“reference”。 ClassReference // ClassReferenceSig表示一个uint64类型的值 // 引用类型Entry的签名。 ClassReferenceSig // ClassString表示值是字符串。 如果 // 编译单元指定AttrUseUTF8标志(强烈地 // 推荐),字符串值将以UTF-8编码。 // 否则,未指定编码。 ClassString // ClassReferenceAlt表示int64类型的值 // DWARF“info”部分中的偏移量 // 对象文件。 ClassReferenceAlt // ClassStringAlt表示类型为int64的值 // 偏移到备用对象的DWARF字符串部分 // 文件。 ClassStringAlt)
func (i Class) GoString() string
func (i Class) String() string
CommonType 保存多种类型通用的字段。如果某个字段对于给定的类型不知道或不适用,则使用零值。
type CommonType struct { ByteSize int64 // 此类型的值的大小,以字节为单位 Name string // 可用于引用类型的名称
func (c *CommonType) Common() *CommonType
func (c *CommonType) Size() int64
ComplexType 表示复杂的浮点类型。
type ComplexType struct { BasicType}
数据表示从可执行文件(例如,ELF 或 Mach-O 可执行文件)加载的 DWARF 调试信息。
type Data struct { // 包含过滤或未导出的字段}
func New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, error)
New 返回从给定参数初始化的新 Data 对象。客户端不应该直接调用此函数,而应使用适当的包 debug/elf,debug/macho 或 debug/pe 的 File 类型的 DWARF 方法。
[]byte 参数是来自对象文件中相应调试部分的数据; 例如,对于 ELF 对象,缩写是 “.debug_abbrev” 部分的内容。
func (d *Data) AddTypes(name string, types []byte) error
AddTypes 将为 DWARF数据添加一个 .debug_types 节。具有DWARF 版本4调试信息的典型对象将具有多个 .debug_types 部分。名称仅用于错误报告,用于区分一个 .debug_types 和另一个。
func (d *Data) LineReader(cu *Entry) (*LineReader, error)
LineReader 为编译单元 cu 的行表返回一个新的读取器,该读取器必须是具有标记 TagCompileUnit 的条目。
如果此编译单元没有行表,则返回 nil,nil。
func (d *Data) Ranges(e *Entry) ([][2]uint64, error)
范围返回由e覆盖的PC范围,这是一对[低,高]对。只有一些条目类型(如 TagCompileUnit 或 TagSubprogram)具有PC范围;对于其他人,这将返回零,没有错误。
func (d *Data) Reader() *Reader
Reader会返回一个新的数据读取器。阅读器位于DWARF“info”部分的字节偏移量0处。
func (d *Data) Type(off Offset) (Type, error)
类型在 DWARF “info”部分关闭时读取类型。
type DecodeError struct { Name string Offset Offset Err string}
func (e DecodeError) Error() string
DotDotDotType 表示可变参数...函数参数。
type DotDotDotType struct { CommonType}
func (t *DotDotDotType) String() string
entry 是一系列属性/值(attribute/value)对。
type Entry struct { Offset Offset // DWARF信息中的条目偏移 Tag Tag // 标签(Entry的种类) Children bool // whether Entry is followed by children Field []Field}
func (e *Entry) AttrField(a Attr) *Field
AttrField 返回 Entry中与属性 Attr 关联的字段,如果没有此属性,则返回 nil。
func (e *Entry) Val(a Attr) interface{}
Val 在 Entry 中返回与属性 Attr 相关的值,如果没有这个属性,则返回 nil。
一个常见的习惯用法是将无返回检查与检查该值是否具有预期的动态类型进行合并,如下所示:
v, ok := e.Val(AttrSibling).(int64)
EnumType 表示枚举类型。其本地整数类型的唯一指示是它的ByteSize (在 CommonType中)。
type EnumType struct { CommonType EnumName string Val []*EnumValue}
func (t *EnumType) String() string
EnumValue 表示一个枚举值。
type EnumValue struct { Name string Val int64}
字段是 Entry 中的单个属性/值对。
值可以是由 DWARF 定义的几个“属性类(attribute classes)”之一。每个类对应的 Go类型是:
DWARF class Go type Class----------- ------- -----address uint64 ClassAddress block []byte ClassBlock constant int64 ClassConstant flag bool ClassFlag reference to info dwarf.Offset ClassReference to type unit uint64 ClassReferenceSig string string ClassString exprloc []byte ClassExprLoc lineptr int64 ClassLinePtr loclistptr int64 ClassLocListPtr macptr int64 ClassMacPtr rangelistptr int64 ClassRangeListPtr
对于无法识别的或供应商定义的属性,Class 可能是ClassUnknown。
type Field struct { Attr Attr Val interface{} Class Class}
FloatType 表示浮点类型。
type FloatType struct { BasicType}
FuncType 表示一个函数类型。
type FuncType struct { CommonType ReturnType Type ParamType []Type}
func (t *FuncType) String() string
IntType 表示一个有符号的整数类型。
type IntType struct { BasicType}
LineEntry 是 DWARF 行表中的一行。
type LineEntry struct { // 地址是机器的程序计数器值 // 由编译器生成的指令。 LineEntry // 适用于Address中的每条指令 // 下一个LineEntry的地址。 Address uint64 // OpIndex是VLIW内操作的索引 // 指令。 第一个操作的索引是0. 对于 // 非VLIW体系结构,它将始终为0。地址和 // OpIndex一起形成一个可以的操作指针 // 参考指令中的任何单独操作 // 流(stream)。 OpIndex int // 文件是与这些相对应的源文件 // 说明。 File *LineFile // Line是与这些对应的源代码行号 // 说明。 行从1开始编号。可能是 // 0如果这些说明不能归因于任何来源 // 行。 Line int // 列是这些源代码行中的列号 // 说明。 列从1开始编号。它可以 // 为0表示该行的“左边缘”。 Column int // IsStmt表示Address是推荐的断点 // 位置,如行,语句或以下的开头 // 声明的不同部分。 IsStmt bool // BasicBlock表示Address是以下的开头 // 基本块。 BasicBlock bool // PrologueEnd表示地址是一个(可能是 // 许多)PCs,执行应该暂停一个 // 进入包含函数的断点。 // // 在DWARF 3中添加。 PrologueEnd bool // EpilogueBegin指出Address是可能的 // 许多)PCs,执行应该暂停一个 // 退出此函数时的断点。 // // 在DWARF 3中添加。 EpilogueBegin bool // ISA是这些指令集架构 //说明。 可能的ISA值应该由 // 适用的ABI规范。 // // 在DWARF 3中添加。 ISA int // 鉴别器是指示块的任意整数 // 这些说明属于哪些。 它服务于 // 区分可能与之相关的多个区块 // 相同的源文件,行和列。 当只有一个 // 块对于给定的源位置存在,它应该是0。 // // 在DWARF 3中添加。 Discriminator int // EndSequence表示该地址是之后的第一个字节 // 一系列目标机器指令的结束。 如果它 // 被设置,只有这个和地址字段是有意义的。 一个 // 行号表可能包含多个信息 // 可能不相交的指令序列。 最后一项 // 在行表中应始终设置EndSequence。 EndSequence bool}
LineFile 是由 DWARF 行表项引用的源文件。
type LineFile struct { Name string Mtime uint64 // 实现定义了修改时间,如果未知则为0 Length int // 文件长度,如果未知,则为0}
LineReader 从 DWARF“line”部分为单个编译单元读取一系列LineEntry 结构。LineEntries 按照增加PC的顺序发生,并且每个LineEntry 都为从该 LineEntry 的PC到下一个 LineEntry 的PC之前的指令提供元数据。最后一项将设置其 EndSequence 字段。
type LineReader struct { // 包含过滤或未导出的字段}
func (r *LineReader) Next(entry *LineEntry) error
接下来将*entry 设置到此行表中的下一行并移至下一行。如果没有更多条目并且行表正确终止,它将返回 io.EOF。
行总是按照递增条目的顺序排列。地址,但 entry.Line 可以前进或后退。
func (r *LineReader) Reset()
复位重新定位行表格 reader 在行表格的开头。
func (r *LineReader) Seek(pos LineReaderPos)
Seek 将行表读取器恢复到 Tell 返回的位置。
参数 pos 必须已经通过在此行表上调用 Tell 来返回。
func (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error
SeekPC 将*entry 设置为包含 pc 的 LineEntry,并将读取器放置在行表中的下一个条目上。如有必要,这将寻求反向查找电脑。
如果pc未被此行表中的任何条目覆盖,SeekPC 将返回ErrUnknownPC。在这种情况下,*entry 和最终的查找位置是未指定的。
请注意,DWARF 行表只允许顺序扫描,正向扫描。因此,在最坏的情况下,线表的大小需要时间线性。如果调用者希望重复进行快速的 PC 查找,则应该为行表建立适当的索引。
func (r *LineReader) Tell() LineReaderPos
Tell 返回行表中的当前位置。
LineReaderPos 表示行表中的位置。
type LineReaderPos struct { // 包含过滤或未导出的字段}
Offset 表示 DWARF 信息内条目的位置。(见 Reader.Seek。)
type Offset uint32
PtrType 表示一个指针类型。
type PtrType struct { CommonType Type Type}
func (t *PtrType) String() string
QualType 表示具有 C/C++“const”,“restrict” 或 “volatile” 限定符的类型。
type QualType struct { CommonType Qual string Type Type}
func (t *QualType) Size() int64
func (t *QualType) String() string
阅读器允许从 DWARF “info”部分读取条目结构。Entry 结构排列在树中。Reader 的 Next 函数从树的预定义遍历中返回连续的条目。如果一个条目有子类,它的子类字段将是真实的,并且子类跟随,终止于具有标签 0 的条目。
type Reader struct { // 包含过滤或未导出的字段}
func (r *Reader) AddressSize() int
AddressSize 返回当前编译单元中地址的大小(以字节为单位)。
func (r *Reader) Next() (*Entry, error)
接下来从编码的入口流中读取下一个条目。当它到达该部分的末尾时返回 nil,nil。如果当前偏移量无效或者偏移量中的数据无法解码为有效条目,则返回错误。
func (r *Reader) Seek(off Offset)
在编码的入口流中寻找偏移读取器的位置。偏移量 0 可以用来表示第一个条目。
func (r *Reader) SeekPC(pc uint64) (*Entry, error)
SeekPC 返回包含 pc 的编译单元的 Entry,并让阅读器读取该单元的子元素。如果 pc 没有被任何单元覆盖,SeekPC 返回ErrUnknownPC 并且读取器的位置是未定义的。
因为编译单元可以描述可执行文件的多个区域,所以最糟糕的情况是 SeekPC 必须搜索所有编译单元中的所有范围。每次调用SeekPC 时都会在最后一次调用的编译单元中开始搜索,因此一般来说,查看一系列 PC 时,如果它们被分类,速度会更快。如果调用者希望重复进行快速 PC 查找,则应使用 Ranges 方法构建适当的索引。
func (r *Reader) SkipChildren()
SkipChildren 跳过与 Next 返回的最后一个条目关联的子条目。如果该条目没有子类,或者 Next 未被调用,则 SkipChildren 是无操作的。
StructField 表示结构体,联合体或 C ++ 类类型中的字段。
type StructField struct { Name string Type Type ByteOffset int64 ByteSize int64 BitOffset int64 // 在ByteOffset的ByteSize字节内 BitSize int64 // 如果不是位域,则为零}
StructType 表示结构体,联合体或 C ++ 类的类型。
type StructType struct { CommonType StructName string Kind string // “struct”,“union”或“class”。 Incomplete bool // 如果为true,则struct,union,class被声明但未被定义}
func (t *StructType) Defn() string
func (t *StructType) String() string
标签是条目的分类(类型)。
type Tag uint32
const ( TagArrayType Tag = 0x01 TagClassType Tag = 0x02 TagEntryPoint Tag = 0x03 TagEnumerationType Tag = 0x04 TagFormalParameter Tag = 0x05 TagImportedDeclaration Tag = 0x08 TagLabel Tag = 0x0A TagLexDwarfBlock Tag = 0x0B TagMember Tag = 0x0D TagPointerType Tag = 0x0F TagReferenceType Tag = 0x10 TagCompileUnit Tag = 0x11 TagStringType Tag = 0x12 TagStructType Tag = 0x13 TagSubroutineType Tag = 0x15 TagTypedef Tag = 0x16 TagUnionType Tag = 0x17 TagUnspecifiedParameters Tag = 0x18 TagVariant Tag = 0x19 TagCommonDwarfBlock Tag = 0x1A TagCommonInclusion Tag = 0x1B TagInheritance Tag = 0x1C TagInlinedSubroutine Tag = 0x1D TagModule Tag = 0x1E TagPtrToMemberType Tag = 0x1F TagSetType Tag = 0x20 TagSubrangeType Tag = 0x21 TagWithStmt Tag = 0x22 TagAccessDeclaration Tag = 0x23 TagBaseType Tag = 0x24 TagCatchDwarfBlock Tag = 0x25 TagConstType Tag = 0x26 TagConstant Tag = 0x27 TagEnumerator Tag = 0x28 TagFileType Tag = 0x29 TagFriend Tag = 0x2A TagNamelist Tag = 0x2B TagNamelistItem Tag = 0x2C TagPackedType Tag = 0x2D TagSubprogram Tag = 0x2E TagTemplateTypeParameter Tag = 0x2F TagTemplateValueParameter Tag = 0x30 TagThrownType Tag = 0x31 TagTryDwarfBlock Tag = 0x32 TagVariantPart Tag = 0x33 TagVariable Tag = 0x34 TagVolatileType Tag = 0x35 // 以下是DWARF 3中的新增内容。 TagDwarfProcedure Tag = 0x36 TagRestrictType Tag = 0x37 TagInterfaceType Tag = 0x38 TagNamespace Tag = 0x39 TagImportedModule Tag = 0x3A TagUnspecifiedType Tag = 0x3B TagPartialUnit Tag = 0x3C TagImportedUnit Tag = 0x3D TagMutableType Tag = 0x3E // 后来从DWARF中删除. TagCondition Tag = 0x3F TagSharedType Tag = 0x40 // 以下是DWARF 4中的新功能。 TagTypeUnit Tag = 0x41 TagRvalueReferenceType Tag = 0x42 TagTemplateAlias Tag = 0x43)
func (t Tag) GoString() string
func (t Tag) String() string
类型通常表示指向任何特定类型结构(CharType,StructType等)的指针。
type Type interface { Common() *CommonType String() string Size() int64}
TypedefType 表示一个命名的类型。
type TypedefType struct { CommonType Type Type}
func (t *TypedefType) Size() int64
func (t *TypedefType) String() string
UcharType 表示一个无符号字符类型。
type UcharType struct { BasicType}
UintType 表示无符号整数类型。
type UintType struct { BasicType}
UnspecifiedType 表示隐式,未知,模糊或不存在的类型。
type UnspecifiedType struct { BasicType}
VoidType 表示 C void 类型。
type VoidType struct { CommonType}
func (t *VoidType) String() string