ErrUnknownPC は,シーク PC が回線テーブルのどのエントリにも含まれていない場合に LineReader.ScanPC によって返されるエラーです。
var ErrUnknownPC = errors.New("ErrUnknownPC")
AddrType はマシンアドレス型を表します。
type AddrType struct { BasicType }
ArrayType は,固定サイズの配列型を表します。
type ArrayType struct { CommonType Type Type StrideBitSize int64 // 0 より大きい場合,各要素を保持するビット数 Count int64 // if == -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 (i Attr) String() string
BasicType は,すべての基本型に共通のフィールドを保持します。
type BasicType struct { CommonType BitSize int64 BitOffset int64 }
func (b *BasicType) Basic() *BasicType
func (t *BasicType) String() string
BoolType はブール型を表します。
type BoolType struct { BasicType }
CharType は符号付き文字型を表します。
type CharType struct { BasicType }
Class (クラス) は,属性値の DWARF 4 クラスです。
一般に,与えられた属性の値は, DWARF によって定義されたいくつかの可能なクラスのうちの 1 つをとることができ,それぞれがわずかに異なる属性の解釈を導きます。
DWARF バージョン 4 は,属性値クラスを以前のバージョンの DWARF よりも細かく区別します。 リーダーは, DWARF の以前のバージョンからのより粗いクラスを適切な DWARF 4 クラスに明確にします。 たとえば, DWARF 2 は定数およびすべての型のセクションオフセットに " 定数 " を使用しますが,セクションオフセットが Class*Ptr クラスの 1 つだけである場合でも, DWARF 2 ファイル内の属性を正規化します。 DWARF 3 で定義されています。
type Class int
const ( // ClassUnknown は,未知の DWARF クラスの値を表します。 ClassUnknown Class = iota // ClassAddress は,ターゲットマシンのアドレスである uint64 型の値を表します。 ClassAddress // ClassBlock は,その解釈が属性に依存する type []byte の値を表します。 ClassBlock // ClassConstant は,定数である int64 型の値を表します。 // この定数の解釈は属性によって異なります。 ClassConstant // ClassExprLoc は,エンコードされた DWARF 式または場所の説明を含む []byte の値を表します。 ClassExprLoc // ClassFlag は bool 型の値を表します。 ClassFlag // ClassLinePtr は, "line" セクションへの int64 オフセットの値を表します。 ClassLinePtr // ClassLocListPtr は, "loclist" セクションへの int64 オフセットである値を表します。 ClassLocListPtr // ClassMacPtr は, "mac" セクションへの int64 オフセットである値を表します。 ClassMacPtr // ClassMacPtr は, "rangelist" セクションへの int64 オフセットである値を表します。 ClassRangeListPtr // ClassReference は, info セクション内のエントリのオフセットオフセットである値を表します (Reader.Seek と共に使用します) 。 // DWARF 仕様では, ClassReference と ClassReferenceSig をクラス "reference" にまとめています。 ClassReference // ClassReferenceSig は,エントリ型を参照する uint64 型のシグニチャである値を表します。 ClassReferenceSig // ClassString は文字列である値を表します。 // コンパイル単位が AttrUseUTF8 フラグを指定している場合 (強くお勧めします) ,文字列値は UTF-8 でエンコードされます。 // それ以外の場合,エンコーディングは指定されていません。 ClassString // ClassReferenceAlt は,代替オブジェクトファイルの DWARF "info" セクションへのオフセットである int64 型の値を表します。 ClassReferenceAlt // ClassStringAlt は,代替オブジェクトファイルの DWARF 文字列セクションへのオフセットである int64 型の値を表します。 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 }
Data は,実行可能ファイル (たとえば, 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 のファイル型の DWARF メソッドを使用する必要があります。
[]byte 引数は,オブジェクトファイル内の対応するデバッグセクションからのデータです。 たとえば, ELF オブジェクトの場合, abbrev は ".debug_abbrev" セクションの内容です。
func (d *Data) AddTypes(name string, types []byte) error
AddTypes は DWARF データに 1 つの .debug_types セクションを追加します。 DWARF バージョン 4 のデバッグ情報を持つ一般的なオブジェクトには,複数の .debug_types セクションがあります。 この名前はエラー報告にのみ使用され, 1 つの .debug_types セクションを別のセクションと区別するのに役立ちます。
func (d *Data) LineReader(cu *Entry) (*LineReader, error)
LineReader は,コンパイル単位 cu の行テーブルの新しいリーダーを返します。 これは, TagCompileUnit タグを持つエントリである必要があります。
このコンパイル単位に行テーブルがない場合は, nil, nil を返します。
func (d *Data) Ranges(e *Entry) ([][2]uint64, error)
Ranges は, [low,high) ペアのスライスである e でカバーされる PC 範囲を返します。 TagCompileUnit や TagSub プログラムなどの一部のエントリ型にのみ PC 範囲があります。 他の人にとっては,これはエラーなしで nil を返すでしょう。
func (d *Data) Reader() *Reader
Reader は新しい Reader for Data を返します。 リーダーは, DWARF の " 情報 " セクションのバイトオフセット 0 に配置されています。
func (d *Data) Type(off Offset) (Type, error)
Type は DWARF の “info” セクションの off の位置にある型を読み込みます。
type DecodeError struct { Name string Offset Offset Err string }
func (e DecodeError) Error() string
DotDotDotType は可変個の ... 関数パラメータを表します。
type DotDotDotType struct { CommonType }
func (t *DotDotDotType) String() string
エントリは,属性と値のペアのシーケンスです。
type Entry struct { Offset Offset // DWARF 情報のエントリのオフセット Tag Tag // タグ (エントリーの種類) Children bool // エントリーの後に子供がいるかどうか Field []Field }
func (e *Entry) AttrField(a Attr) *Field
AttrField は Entry の属性 Attr に関連付けられた Field を返します。 そのような属性がない場合は nil を返します。
func (e *Entry) Val(a Attr) interface{}
Val は Entry の属性 Attr に関連付けられた値を返します。 そのような属性がない場合は nil を返します。
nil return のチェックと,値が予想される動的型であることのチェックを同時に行う一般的な方法は以下です。
v, ok := e.Val(AttrSibling).(int64)
EnumType は列挙型を表します。 そのネイティブの整数型の唯一の指示は,その ByteSize(CommonType 内部) です。
type EnumType struct { CommonType EnumName string Val []*EnumValue }
func (t *EnumType) String() string
EnumValue は 1 つの列挙値を表します。
type EnumValue struct { Name string Val int64 }
Field (フィールド) は,エントリ内の 1 つの属性と値のペアです。
値は, DWARF によって定義されたいくつかの " 属性クラス " の 1 つになります。 各クラスに対応する Go 型は以下のとおりです。
DWARF クラス Go 型 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 // Go 1.5 }
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 の直前までの各命令に適用されます。 Address uint64 // OpIndex は, VLIW 命令内の操作のインデックスです。 // 最初の操作のインデックスは 0 です。 // VLIW 以外のアーキテクチャでは,常に 0 になります。 // Address と OpIndex は,命令ストリーム内の個々の操作を参照できる操作ポインタを形成します。 OpIndex int // File はこれらの命令に対応するソースファイルです。 File *LineFile // Line はこれらの命令に対応するソースコード行番号です。 // 行の番号は 1 から始まります。 // これらの命令がどのソース行にも属さない場合は, 0 になることがあります。 Line int // Column は,これらの命令のソース行内の列番号です。 // 列には 1 から始まる番号が付けられます。 // 行の " 左端 " を示すために 0 になる場合があります。 Column int // IsStmt は, Address が行,ステートメント,ステートメントの個別のサブパートなど,推奨されるブレークポイントの場所であることを示します。 IsStmt bool // BasicBlock は, Address が基本ブロックの始まりであることを示します。 BasicBlock bool // PrologueEnd は, Address が含まれている関数への入り口でブレークポイントのために実行が延期されるべき (おそらく多くの)1 台の PC であることを示します。 // // DWARF 3 で追加されました。 PrologueEnd bool // EpilogueBegin は, Address が,この関数の終了時にブレークポイントのために実行が中断されるべき 1 つの (おそらく多数の) PC であることを示します。 // // DWARF 3 で追加されました。 EpilogueBegin bool // ISA はこれらの命令の命令セットアーキテクチャです。 // 可能な ISA 値は適切な ABI 仕様によって定義されるべきです。 // // DWARF 3 で追加されました。 ISA int // Discriminator は,これらの命令が属するブロックを示す任意の整数です。 // これは,すべて同じソースファイル,行,および列を持つ可能性がある複数のブロックを区別するのに役立ちます。 // 与えられたソース位置に対して 1 つのブロックしか存在しない場合,それは 0 であるべきです。 // // DWARF 3 で追加されました。 Discriminator int // EndSequence は, Address が一連のターゲットマシン命令の終了後の最初のバイトであることを示します。 // 設定されている場合,これと Address フィールドのみが意味を持ちます。 // 行番号テーブルは,複数の潜在的にばらばらの命令シーケンスに関する情報を含むことができる。 // ラインテーブルの最後のエントリには,必ず EndSequence を設定してください。 EndSequence bool }
LineFile は, DWARF 行テーブルエントリによって参照されるソースファイルです。
type LineFile struct { Name string Mtime uint64 // 実装定義の修正時間,または不明の場合は 0 Length int // ファイル長,または不明の場合は 0 }
LineReader は, 1 つのコンパイル単位に対して, DWARF の "line" セクションから LineEntry 構造体のシーケンスを読み取ります。 LineEntries は PC が増加する順に発生し,各 LineEntry はその LineEntry の PC から次の LineEntry の PC の直前までの命令のメタデータを提供します。 最後のエントリには, EndSequence フィールドが設定されています。
type LineReader struct {
// エクスポートされていないフィールドがあります
}
func (r *LineReader) Next(entry *LineEntry) error
Next は,このラインテーブルの次の行に * エントリを設定して,次の行に移動します。 それ以上エントリがなく,行テーブルが正しく終了している場合は, io.EOF を返します。
行は常に entry.Address の昇順になっていますが, entry.Line は前後に移動することがあります。
func (r *LineReader) Reset()
リセットすると,行テーブルリーダーは行テーブルの先頭に移動します。
func (r *LineReader) Seek(pos LineReaderPos)
Seek は, Line テーブルリーダーを Tell によって返された位置に復元します。
引数 pos は,この行テーブルに対して Tell を呼び出して返されたものでなければなりません。
func (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error
SeekPC は pc を含む LineEntry に * エントリを設定し,ラインテーブルの次のエントリにリーダーを配置します。 必要ならば,これは逆方向に探して pc を見つけます。
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
Reader は DWARF の “info” セクションから Entry 構造体を読むことを可能にします。 エントリ構造はツリー状に配置されています。 Reader の Next 関数は,ツリーの事前注文走査から連続したエントリを返します。 エントリに子がある場合,その Children フィールドは true になり,子はそれに続き, Tag 0 のエントリで終了します。
type Reader struct {
// エクスポートされていないフィールドがあります
}
func (r *Reader) AddressSize() int
AddressSize は,現在のコンパイル単位のアドレスのサイズをバイト数で返します。
func (r *Reader) Next() (*Entry, error)
Next は,エンコードされたエントリストリームから次のエントリを読み込みます。 セクションの終わりに達すると, nil, nil を返します。 現在のオフセットが無効であるか,オフセットのデータが有効なエントリとしてデコードできない場合はエラーを返します。
func (r *Reader) Seek(off Offset)
Seek (シーク) は,エンコードされたエントリストリーム内で Reader をオフセット off に配置します。 オフセット 0 を使用して最初の項目を示すことができます。
func (r *Reader) SeekPC(pc uint64) (*Entry, error)
SeekPC は, pc を含むコンパイル単位のエントリを返し,その単位の子を読むようにリーダーを配置します。 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 // 通常はゼロです。 通常のフィールドには Type.Size() を使用してください。 BitOffset int64 // ByteOffset の ByteSize バイト以内 BitSize int64 // ビットフィールドでない場合はゼロ }
StructType は,構造体,共用体,または C++ クラス型を表します。
type StructType struct { CommonType StructName string Kind string // "struct", "union" ,または "class" 。 Field []*StructField Incomplete bool // true の場合, struct, union, class は宣言されているが未定義 }
func (t *StructType) Defn() string
func (t *StructType) String() string
Tag (タグ) はエントリの分類 (型) です。
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 Tag = 0x40 // 以下は DWARF 4 の新機能です。 TagTypeUnit Tag = 0x41 TagRvalueReferenceType Tag = 0x42 TagTemplateAlias Tag = 0x43 )
func (t Tag) GoString() string
func (i Tag) String() string
Type は通常,特定の Type 構造体 (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 }
UnsupportedType は,サポートされていない型に遭遇した場合に返されるプレースホルダーです。
type UnsupportedType struct { CommonType Tag Tag }
func (t *UnsupportedType) String() string
VoidType は C の void 型を表します。
type VoidType struct { CommonType }
func (t *VoidType) String() string