Spec-Zone.ru › Go

Package dwarf

  • import "debug/dwarf"
  • Обзор
  • Индекс

Обзор

Пакет dwarf предоставляет доступ к отладочной информации DWARF, загруженной из исполняемых файлов, как определено в стандарте DWARF 2.0 по адресу http://dwarfstd.org/doc/dwarf-2.0.0.pdf.

Безопасность

Этот пакет не предназначен для защиты от вредоносных входных данных и находится вне сферы действия https://go.dev/security/policy. В частности, при разборе объектных файлов выполняется только базовая проверка. Поэтому следует проявлять осторожность при разборе недоверенных входных данных, так как разбор некорректно сформированных файлов может потребовать значительных ресурсов или вызвать панику.

Индекс

  • Переменные
  • Тип AddrType
  • Тип ArrayType
  • Функция (t *ArrayType) Size() int64
  • Функция (t *ArrayType) String() string
  • Тип Attr
  • Функция (a Attr) GoString() string
  • Функция (i Attr) String() string
  • Тип BasicType
  • Функция (b *BasicType) Basic() *BasicType
  • Функция (t *BasicType) String() string
  • Тип BoolType
  • Тип CharType
  • Тип Class
  • Функция (i Class) GoString() string
  • Функция (i Class) String() string
  • Тип CommonType
  • Функция (c *CommonType) Common() *CommonType
  • Функция (c *CommonType) Size() int64
  • Тип ComplexType
  • Тип Data
  • Функция New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, error)
  • Функция (d *Data) AddSection(name string, contents []byte) error
  • Функция (d *Data) AddTypes(name string, types []byte) error
  • Функция (d *Data) LineReader(cu *Entry) (*LineReader, error)
  • Функция (d *Data) Ranges(e *Entry) ([][2]uint64, error)
  • Функция (d *Data) Reader() *Reader
  • Функция (d *Data) Type(off Offset) (Type, error)
  • Тип DecodeError
  • Функция (e DecodeError) Error() string
  • Тип DotDotDotType
  • Функция (t *DotDotDotType) String() string
  • Тип Entry
  • Функция (e *Entry) AttrField(a Attr) *Field
  • Функция (e *Entry) Val(a Attr) any
  • Тип EnumType
  • Функция (t *EnumType) String() string
  • Тип EnumValue
  • Тип Field
  • Тип FloatType
  • Тип FuncType
  • Функция (t *FuncType) String() string
  • Тип IntType
  • Тип LineEntry
  • Тип LineFile
  • Тип LineReader
  • Функция (r *LineReader) Files() []*LineFile
  • Функция (r *LineReader) Next(entry *LineEntry) error
  • Функция (r *LineReader) Reset()
  • Функция (r *LineReader) Seek(pos LineReaderPos)
  • Функция (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error
  • Функция (r *LineReader) Tell() LineReaderPos
  • Тип LineReaderPos
  • Тип Offset
  • Тип PtrType
  • Функция (t *PtrType) String() string
  • Тип QualType
  • Функция (t *QualType) Size() int64
  • Функция (t *QualType) String() string
  • Тип Reader
  • Функция (r *Reader) AddressSize() int
  • Функция (r *Reader) ByteOrder() binary.ByteOrder
  • Функция (r *Reader) Next() (*Entry, error)
  • Функция (r *Reader) Seek(off Offset)
  • Функция (r *Reader) SeekPC(pc uint64) (*Entry, error)
  • Функция (r *Reader) SkipChildren()
  • Тип StructField
  • Тип StructType
  • Функция (t *StructType) Defn() string
  • Функция (t *StructType) String() string
  • Тип Tag
  • Функция (t Tag) GoString() string
  • Функция (i Tag) String() string
  • Тип Type
  • Тип TypedefType
  • Функция (t *TypedefType) Size() int64
  • Функция (t *TypedefType) String() string
  • Тип UcharType
  • Тип UintType
  • Тип UnspecifiedType
  • Тип UnsupportedType
  • Функция (t *UnsupportedType) String() string
  • Тип VoidType
  • Функция (t *VoidType) String() string

Файлы пакета

attr_string.go buf.go class_string.go const.go entry.go line.go open.go tag_string.go type.go typeunit.go unit.go

Переменные

ErrUnknownPC — это ошибка, возвращаемая LineReader.ScanPC, когда искомый PC не покрывается никаким элементом в таблице строк.

var ErrUnknownPC = errors.New("ErrUnknownPC")

Тип AddrType

AddrType представляет тип машинного адреса.

type AddrType struct {
    BasicType
}

Тип ArrayType

ArrayType представляет тип массива фиксированного размера.

type ArrayType struct {
    CommonType
    Type          Type
    StrideBitSize int64 // if > 0, number of bits to hold each element
    Count         int64 // if == -1, an incomplete array, like char x[].
}

Функция (*ArrayType) Size

func (t *ArrayType) Size() int64

Функция (*ArrayType) String

func (t *ArrayType) String() string

Тип Attr

Attr идентифицирует тип атрибута в DWARF [Entry.Field].

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
    // The following are new in DWARF 3.
    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
    AttrBinaryScale   Attr = 0x5B
    AttrDecimalScale  Attr = 0x5C
    AttrSmall         Attr = 0x5D
    AttrDecimalSign   Attr = 0x5E
    AttrDigitCount    Attr = 0x5F
    AttrPictureString Attr = 0x60
    AttrMutable       Attr = 0x61
    AttrThreadsScaled Attr = 0x62
    AttrExplicit      Attr = 0x63
    AttrObjectPointer Attr = 0x64
    AttrEndianity     Attr = 0x65
    AttrElemental     Attr = 0x66
    AttrPure          Attr = 0x67
    AttrRecursive     Attr = 0x68
    // The following are new in DWARF 4.
    AttrSignature      Attr = 0x69
    AttrMainSubprogram Attr = 0x6A
    AttrDataBitOffset  Attr = 0x6B
    AttrConstExpr      Attr = 0x6C
    AttrEnumClass      Attr = 0x6D
    AttrLinkageName    Attr = 0x6E
    // The following are new in DWARF 5.
    AttrStringLengthBitSize  Attr = 0x6F
    AttrStringLengthByteSize Attr = 0x70
    AttrRank                 Attr = 0x71
    AttrStrOffsetsBase       Attr = 0x72
    AttrAddrBase             Attr = 0x73
    AttrRnglistsBase         Attr = 0x74
    AttrDwoName              Attr = 0x76
    AttrReference            Attr = 0x77
    AttrRvalueReference      Attr = 0x78
    AttrMacros               Attr = 0x79
    AttrCallAllCalls         Attr = 0x7A
    AttrCallAllSourceCalls   Attr = 0x7B
    AttrCallAllTailCalls     Attr = 0x7C
    AttrCallReturnPC         Attr = 0x7D
    AttrCallValue            Attr = 0x7E
    AttrCallOrigin           Attr = 0x7F
    AttrCallParameter        Attr = 0x80
    AttrCallPC               Attr = 0x81
    AttrCallTailCall         Attr = 0x82
    AttrCallTarget           Attr = 0x83
    AttrCallTargetClobbered  Attr = 0x84
    AttrCallDataLocation     Attr = 0x85
    AttrCallDataValue        Attr = 0x86
    AttrNoreturn             Attr = 0x87
    AttrAlignment            Attr = 0x88
    AttrExportSymbols        Attr = 0x89
    AttrDeleted              Attr = 0x8A
    AttrDefaulted            Attr = 0x8B
    AttrLoclistsBase         Attr = 0x8C
)

Функция (Attr) GoString

func (a Attr) GoString() string

Функция (Attr) String

func (i Attr) String() string

Тип BasicType

BasicType содержит поля, общие для всех основных типов.

См. документацию для StructField для получения дополнительной информации об интерпретации полей BitSize/BitOffset/DataBitOffset.

type BasicType struct {
    CommonType
    BitSize       int64
    BitOffset     int64
    DataBitOffset int64 // Go 1.18
}

Функция (*BasicType) Basic

func (b *BasicType) Basic() *BasicType

Функция (*BasicType) String

func (t *BasicType) String() string

Тип BoolType

BoolType представляет булев тип.

type BoolType struct {
    BasicType
}

Тип CharType

CharType представляет тип символа со знаком.

type CharType struct {
    BasicType
}

Тип Class 1.5

Class — это класс DWARF 4 значения атрибута.

В общем случае значение данного атрибута может принимать одно из нескольких возможных классов, определенных в DWARF, каждый из которых приводит к немного разному толкованию атрибута.

Версия DWARF 4 более точно различает классы значений атрибутов, чем предыдущие версии DWARF. Чтец будет различать более грубые классы из более ранних версий DWARF в соответствующие классы DWARF 4. Например, DWARF 2 использует «constant» для констант, а также для всех типов смещений секций, но читатель будет канонизировать атрибуты в файлах DWARF 2, которые ссылаются на смещения секций, в один из классов Class*Ptr, хотя эти классы были определены только в DWARF 3.

type Class int
const (
    // ClassUnknown represents values of unknown DWARF class.
    ClassUnknown Class = iota

    // ClassAddress represents values of type uint64 that are
    // addresses on the target machine.
    ClassAddress

    // ClassBlock represents values of type []byte whose
    // interpretation depends on the attribute.
    ClassBlock

    // ClassConstant represents values of type int64 that are
    // constants. The interpretation of this constant depends on
    // the attribute.
    ClassConstant

    // ClassExprLoc represents values of type []byte that contain
    // an encoded DWARF expression or location description.
    ClassExprLoc

    // ClassFlag represents values of type bool.
    ClassFlag

    // ClassLinePtr represents values that are an int64 offset
    // into the "line" section.
    ClassLinePtr

    // ClassLocListPtr represents values that are an int64 offset
    // into the "loclist" section.
    ClassLocListPtr

    // ClassMacPtr represents values that are an int64 offset into
    // the "mac" section.
    ClassMacPtr

    // ClassRangeListPtr represents values that are an int64 offset into
    // the "rangelist" section.
    ClassRangeListPtr

    // ClassReference represents values that are an Offset offset
    // of an Entry in the info section (for use with Reader.Seek).
    // The DWARF specification combines ClassReference and
    // ClassReferenceSig into class "reference".
    ClassReference

    // ClassReferenceSig represents values that are a uint64 type
    // signature referencing a type Entry.
    ClassReferenceSig

    // ClassString represents values that are strings. If the
    // compilation unit specifies the AttrUseUTF8 flag (strongly
    // recommended), the string value will be encoded in UTF-8.
    // Otherwise, the encoding is unspecified.
    ClassString

    // ClassReferenceAlt represents values of type int64 that are
    // an offset into the DWARF "info" section of an alternate
    // object file.
    ClassReferenceAlt

    // ClassStringAlt represents values of type int64 that are an
    // offset into the DWARF string section of an alternate object
    // file.
    ClassStringAlt

    // ClassAddrPtr represents values that are an int64 offset
    // into the "addr" section.
    ClassAddrPtr

    // ClassLocList represents values that are an int64 offset
    // into the "loclists" section.
    ClassLocList

    // ClassRngList represents values that are a uint64 offset
    // from the base of the "rnglists" section.
    ClassRngList

    // ClassRngListsPtr represents values that are an int64 offset
    // into the "rnglists" section. These are used as the base for
    // ClassRngList values.
    ClassRngListsPtr

    // ClassStrOffsetsPtr represents values that are an int64
    // offset into the "str_offsets" section.
    ClassStrOffsetsPtr
)

Функция (Class) GoString 1.5

func (i Class) GoString() string

Функция (Class) String 1.5

func (i Class) String() string

Тип CommonType

CommonType содержит поля, общие для нескольких типов. Если поле неизвестно или неприменимо для данного типа, используется нулевое значение.

type CommonType struct {
    ByteSize int64  // size of value of this type, in bytes
    Name     string // name that can be used to refer to type
}

Функция (*CommonType) Common

func (c *CommonType) Common() *CommonType

Функция (*CommonType) Size

func (c *CommonType) Size() int64

Тип ComplexType

ComplexType представляет комплексный тип с плавающей точкой.

type ComplexType struct {
    BasicType
}

Тип Data

Data представляет отладочную информацию DWARF, загруженную из исполняемого файла (например, исполняемого файла ELF или Mach-O).

type Data struct {
    // contains filtered or unexported fields
}

Функция New

func New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, error)

New возвращает новый объект Data, инициализированный из указанных параметров. Клиенты обычно не должны вызывать эту функцию напрямую, а должны использовать метод DWARF типа File соответствующего пакета debug/elf, debug/macho или debug/pe.

Аргументы []byte — данные из соответствующей отладочной секции в объектном файле; например, для объектного файла ELF, abbrev содержит содержимое секции ".debug_abbrev".

Функция (*Data) AddSection 1.14

func (d *Data) AddSection(name string, contents []byte) error

AddSection добавляет другую секцию DWARF по имени. Имя должно быть именем секции DWARF, например, ".debug_addr", ".debug_str_offsets" и т. д. Этот подход используется для новых секций DWARF, добавленных в DWARF 5 и более поздних версиях.

Функция (*Data) AddTypes 1.3

func (d *Data) AddTypes(name string, types []byte) error

AddTypes добавит одну секцию .debug_types в данные DWARF. Типичный объект с отладочной информацией DWARF версии 4 будет содержать несколько секций .debug_types. Имя используется только для отладки ошибок и служит для различения одной секции .debug_types от другой.

Функция (*Data) LineReader 1.5

func (d *Data) LineReader(cu *Entry) (*LineReader, error)

LineReader возвращает новый читатель для таблицы строк единицы компиляции cu, которая должна быть элементом Entry с тегом TagCompileUnit.

Если у этой единицы компиляции нет таблицы строк, она возвращает nil, nil.

func (*Data) Ranges 1.7

func (d *Data) Ranges(e *Entry) ([][2]uint64, error)

Ranges возвращает диапазоны PC, покрываемые e, — срез пар [low,high). Только некоторые типы записей, такие как TagCompileUnit или TagSubprogram, имеют диапазоны PC; для других этот метод вернёт nil без ошибки.

func (*Data) Reader

func (d *Data) Reader() *Reader

Reader возвращает новый Reader для Data. Чтение начинается с байтового смещения 0 в секции DWARF «info».

func (*Data) Type

func (d *Data) Type(off Offset) (Type, error)

Type считывает тип по смещению off в секции DWARF «info».

type DecodeError

type DecodeError struct {
    Name   string
    Offset Offset
    Err    string
}

func (DecodeError) Error

func (e DecodeError) Error() string

type DotDotDotType

DotDotDotType представляет параметр функции с переменным числом аргументов (...).

type DotDotDotType struct {
    CommonType
}

func (*DotDotDotType) String

func (t *DotDotDotType) String() string

type Entry

Запись — это последовательность пар атрибут/значение.

type Entry struct {
    Offset   Offset // offset of Entry in DWARF info
    Tag      Tag    // tag (kind of Entry)
    Children bool   // whether Entry is followed by children
    Field    []Field
}

func (*Entry) AttrField 1.5

func (e *Entry) AttrField(a Attr) *Field

AttrField возвращает Field, связанный с атрибутом Attr в Entry, или nil, если такого атрибута нет.

func (*Entry) Val

func (e *Entry) Val(a Attr) any

Val возвращает значение, связанное с атрибутом Attr в Entry, или nil, если такого атрибута нет.

Распространённый приём — объединение проверки на nil возвращаемого значения с проверкой того, что значение имеет ожидаемый динамический тип, как в примере ниже:

v, ok := e.Val(AttrSibling).(int64)

type EnumType

EnumType представляет перечислимый тип. Единственное указание на его родной целочисленный тип — это ByteSize (внутри CommonType).

type EnumType struct {
    CommonType
    EnumName string
    Val      []*EnumValue
}

func (*EnumType) String

func (t *EnumType) String() string

type EnumValue

EnumValue представляет одно значение перечисления.

type EnumValue struct {
    Name string
    Val  int64
}

type Field

Field — это пара «атрибут/значение» в Entry.

Значение может быть одним из нескольких «классов атрибутов», определённых в DWARF. Соответствующие им типы 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   any
    Class Class // Go 1.5
}

type FloatType

FloatType представляет тип с плавающей запятой.

type FloatType struct {
    BasicType
}

type FuncType

FuncType представляет тип функции.

type FuncType struct {
    CommonType
    ReturnType Type
    ParamType  []Type
}

func (*FuncType) String

func (t *FuncType) String() string

type IntType

IntType представляет целочисленный тип со знаком.

type IntType struct {
    BasicType
}

type LineEntry 1.5

LineEntry — это строка в таблице строк DWARF.

type LineEntry struct {
    // Address is the program-counter value of a machine
    // instruction generated by the compiler. This LineEntry
    // applies to each instruction from Address to just before the
    // Address of the next LineEntry.
    Address uint64

    // OpIndex is the index of an operation within a VLIW
    // instruction. The index of the first operation is 0. For
    // non-VLIW architectures, it will always be 0. Address and
    // OpIndex together form an operation pointer that can
    // reference any individual operation within the instruction
    // stream.
    OpIndex int

    // File is the source file corresponding to these
    // instructions.
    File *LineFile

    // Line is the source code line number corresponding to these
    // instructions. Lines are numbered beginning at 1. It may be
    // 0 if these instructions cannot be attributed to any source
    // line.
    Line int

    // Column is the column number within the source line of these
    // instructions. Columns are numbered beginning at 1. It may
    // be 0 to indicate the "left edge" of the line.
    Column int

    // IsStmt indicates that Address is a recommended breakpoint
    // location, such as the beginning of a line, statement, or a
    // distinct subpart of a statement.
    IsStmt bool

    // BasicBlock indicates that Address is the beginning of a
    // basic block.
    BasicBlock bool

    // PrologueEnd indicates that Address is one (of possibly
    // many) PCs where execution should be suspended for a
    // breakpoint on entry to the containing function.
    //
    // Added in DWARF 3.
    PrologueEnd bool

    // EpilogueBegin indicates that Address is one (of possibly
    // many) PCs where execution should be suspended for a
    // breakpoint on exit from this function.
    //
    // Added in DWARF 3.
    EpilogueBegin bool

    // ISA is the instruction set architecture for these
    // instructions. Possible ISA values should be defined by the
    // applicable ABI specification.
    //
    // Added in DWARF 3.
    ISA int

    // Discriminator is an arbitrary integer indicating the block
    // to which these instructions belong. It serves to
    // distinguish among multiple blocks that may all have with
    // the same source file, line, and column. Where only one
    // block exists for a given source position, it should be 0.
    //
    // Added in DWARF 3.
    Discriminator int

    // EndSequence indicates that Address is the first byte after
    // the end of a sequence of target machine instructions. If it
    // is set, only this and the Address field are meaningful. A
    // line number table may contain information for multiple
    // potentially disjoint instruction sequences. The last entry
    // in a line table should always have EndSequence set.
    EndSequence bool
}

type LineFile 1.5

LineFile — это имя файла, на которое ссылается запись таблицы строк DWARF.

type LineFile struct {
    Name   string
    Mtime  uint64 // Implementation defined modification time, or 0 if unknown
    Length int    // File length, or 0 if unknown
}

type LineReader 1.5

LineReader считывает последовательность структур LineEntry из секции DWARF «строка» для одного блока компиляции. LineEntry появляются в порядке возрастания PC, и каждая LineEntry даёт метаданные для инструкций от PC этой LineEntry до значения PC следующей LineEntry. Последняя запись будет иметь поле [LineEntry.EndSequence], установленное в true.

type LineReader struct {
    // contains filtered or unexported fields
}

func (*LineReader) Files 1.14

func (r *LineReader) Files() []*LineFile

Files возвращает таблицу имён файлов для этого блока компиляции на основе текущего положения в таблице строк. Таблица имён файлов может быть использована для атрибутов в этом блоке компиляции, таких как AttrDeclFile.

Элемент 0 всегда равен nil, так как индекс файла 0 обозначает «нет файла».

Таблица имён файлов блока компиляции не является фиксированной. Files возвращает таблицу файлов на основе текущего положения в таблице строк. Эта таблица может содержать больше элементов, чем таблица файлов в более ранней позиции в таблице строк, хотя существующие элементы никогда не изменяются.

func (*LineReader) Next 1.5

func (r *LineReader) Next(entry *LineEntry) error

Next устанавливает *entry в следующую строку в этой таблице строк и переходит к следующей строке. Если больше строк нет, и таблица строк корректно завершена, возвращает io.EOF.

Строки всегда упорядочены по возрастанию entry.Address, но entry.Line может идти вперёд или назад.

func (*LineReader) Reset 1.5

func (r *LineReader) Reset()

Reset переносит указатель чтения таблицы строк в начало таблицы.

func (*LineReader) Seek 1.5

func (r *LineReader) Seek(pos LineReaderPos)

Seek восстанавливает указатель чтения таблицы строк до позиции, возвращённой методом LineReader.Tell.

Аргумент pos должен быть возвращён методом LineReader.Tell для этой таблицы строк.

func (*LineReader) SeekPC 1.5

func (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error

SeekPC устанавливает *entry в LineEntry, который включает pc, и устанавливает указатель чтения на следующую запись в таблице строк. При необходимости, это поиск будет происходить назад для поиска pc.

Если pc не покрывается никакой записью в этой таблице строк, SeekPC возвращает ErrUnknownPC. В этом случае, *entry и конечная позиция поиска не определены.

Обратите внимание, что таблицы строк DWARF допускают только последовательные сканирования вперёд. Поэтому в худшем случае это занимает время, линейно зависящее от размера таблицы строк. Если вызывающий хочет выполнять быстрый поиск PC повторно, он должен создать соответствующий индекс таблицы строк.

func (*LineReader) Tell 1.5

func (r *LineReader) Tell() LineReaderPos

Tell возвращает текущую позицию в таблице строк.

type LineReaderPos 1.5

LineReaderPos представляет позицию в таблице строк.

type LineReaderPos struct {
    // contains filtered or unexported fields
}

type Offset

Offset представляет расположение Entry в секции DWARF info. (См. Reader.Seek.)

type Offset uint32

type PtrType

PtrType представляет указатель на тип.

type PtrType struct {
    CommonType
    Type Type
}

func (*PtrType) String

func (t *PtrType) String() string

type QualType

QualType представляет тип, имеющий квалификатор «const», «restrict» или «volatile» в C/C++.

type QualType struct {
    CommonType
    Qual string
    Type Type
}

func (*QualType) Size

func (t *QualType) Size() int64

func (*QualType) String

func (t *QualType) String() string

type Reader

Reader позволяет считывать структуры Entry из секции DWARF «info». Структуры Entry организованы в виде дерева. Функция Reader.Next возвращает последовательные записи из обхода дерева в порядке обхода. Если запись имеет дочерние записи, её поле Children будет true, и за ней следуют дочерние записи, завершающиеся записью с Tag 0.

type Reader struct {
    // contains filtered or unexported fields
}

func (*Reader) AddressSize 1.5

func (r *Reader) AddressSize() int

AddressSize возвращает размер адресов в байтах в текущем блоке компиляции.

func (*Reader) ByteOrder 1.14

func (r *Reader) ByteOrder() binary.ByteOrder

ByteOrder возвращает порядок байтов в текущем блоке компиляции.

func (*Reader) Next

func (r *Reader) Next() (*Entry, error)

Next считывает следующую запись из потока кодированных записей. Возвращает nil, nil, когда достигает конца секции. Возвращает ошибку, если текущее смещение недействительно или данные по смещению не могут быть декодированы как действительная запись Entry.

func (*Reader) Seek

func (r *Reader) Seek(off Offset)

Seek устанавливает указатель Reader по смещению off в потоке закодированных записей. Смещение 0 может использоваться для обозначения первой записи.

func (*Reader) SeekPC 1.7

func (r *Reader) SeekPC(pc uint64) (*Entry, error)

SeekPC возвращает Entry для блока компиляции, который включает pc, и устанавливает указатель чтения для считывания дочерних элементов этого блока. Если pc не покрывается ни одним блоком, SeekPC возвращает ErrUnknownPC, и позиция указателя чтения не определена.

Поскольку блоки компиляции могут описывать несколько областей исполняемого файла, в худшем случае SeekPC должен искать во всех диапазонах во всех блоках компиляции. Каждый вызов SeekPC начинает поиск с блока компиляции последнего вызова, поэтому, как правило, поиск последовательности PC будет быстрее, если они отсортированы. Если вызывающий хочет выполнять быстрый поиск PC повторно, он должен создать соответствующий индекс с использованием метода Ranges.

func (*Reader) SkipChildren

func (r *Reader) SkipChildren()

SkipChildren пропускает дочерние записи, связанные с последней записью Entry, возвращённой методом Reader.Next. Если у этой записи нет дочерних элементов или метод Reader.Next не был вызван, SkipChildren не делает ничего.

type StructField

StructField представляет поле в типе структуры, объединения или C++ класса.

Битовые поля

Поля BitSize, BitOffset и DataBitOffset описывают размер и смещение битовых полей для членов данных, объявленных как битовые поля в C/C++ структурах/объединениях/классах.

BitSize — количество битов в битовом поле.

DataBitOffset, если не равно нулю, — количество битов от начала включающего сущности (например, содержащей структуры/класса/объединения) до начала битового поля. Это соответствует атрибуту DW_AT_data_bit_offset DWARF, который был введён в DWARF 4.

BitOffset, если не равно нулю, — количество битов между старшим битом хранящего элемента, содержащего битовое поле, и старшим битом битового поля. Здесь «хранящий элемент» — это имя типа перед битовым полем (для поля «unsigned x:17» хранящий элемент — «unsigned»). Значения BitOffset могут различаться в зависимости от порядка байтов системы. BitOffset соответствует атрибуту DW_AT_bit_offset DWARF, который был устаревшим в DWARF 4 и удалён в DWARF 5.

Максимум одно из DataBitOffset и BitOffset будет отличным от нуля; DataBitOffset/BitOffset будут отличными от нуля только если BitSize отлично от нуля. То, какое значение использует компилятор C, будет зависеть от версии компилятора и параметров командной строки.

Вот пример использования побитовых полей в C/C++, а также ожидаемая информация о смещениях битов в DWARF. Рассмотрим этот код:

struct S {
	int q;
	int j:5;
	int k:6;
	int m:5;
	int n:8;
} s;

Для приведенного кода ожидаются следующие значения DW_AT_bit_offset (с использованием GCC 8):

       Little   |     Big
       Endian   |    Endian
                |
"j":     27     |     0
"k":     21     |     5
"m":     16     |     11
"n":     8      |     16

Обратите внимание, что указанные смещения относятся исключительно к содержащему блоку памяти для j/k/m/n — эти значения не изменяются в зависимости от размера предыдущих членов данных в содержащей структуре.

Если компилятор выводит DW_AT_data_bit_offset, ожидаемые значения будут следующими:

"j":     32
"k":     37
"m":     43
"n":     48

Здесь значение 32 для «j» отражает тот факт, что побитовое поле предшествуют другие члены данных (вспомните, что значения DW_AT_data_bit_offset относятся к началу содержащей структуры). Следовательно, значения DW_AT_data_bit_offset могут быть достаточно большими для структур с множеством полей.

DWARF также допускает возможность базовых типов с ненулевым размером и смещением битов, поэтому эта информация также фиксируется для базовых типов. Однако стоит отметить, что задействовать это поведение в распространённых языках невозможно.

type StructField struct {
    Name          string
    Type          Type
    ByteOffset    int64
    ByteSize      int64 // usually zero; use Type.Size() for normal fields
    BitOffset     int64
    DataBitOffset int64 // Go 1.18
    BitSize       int64 // zero if not a bit field
}

тип StructType

StructType представляет тип структуры, объединения или C++ класса.

type StructType struct {
    CommonType
    StructName string
    Kind       string // "struct", "union", or "class".
    Field      []*StructField
    Incomplete bool // if true, struct, union, class is declared but not defined
}

функция (*StructType) Defn

func (t *StructType) Defn() string

функция (*StructType) String

func (t *StructType) String() string

тип Tag

Tag — это классификация (тип) Entry.

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
    // The following are new in 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 // Later removed from DWARF.
    TagCondition       Tag = 0x3F
    TagSharedType      Tag = 0x40
    // The following are new in DWARF 4.
    TagTypeUnit            Tag = 0x41
    TagRvalueReferenceType Tag = 0x42
    TagTemplateAlias       Tag = 0x43
    // The following are new in DWARF 5.
    TagCoarrayType       Tag = 0x44
    TagGenericSubrange   Tag = 0x45
    TagDynamicType       Tag = 0x46
    TagAtomicType        Tag = 0x47
    TagCallSite          Tag = 0x48
    TagCallSiteParameter Tag = 0x49
    TagSkeletonUnit      Tag = 0x4A
    TagImmutableType     Tag = 0x4B
)

функция (Tag) GoString

func (t Tag) GoString() string

функция (Tag) String

func (i Tag) String() string

тип Type

Type, как правило, представляет указатель на любой из конкретных структур типов (CharType, StructType и т.д.).

type Type interface {
    Common() *CommonType
    String() string
    Size() int64
}

тип TypedefType

TypedefType представляет именованный тип.

type TypedefType struct {
    CommonType
    Type Type
}

функция (*TypedefType) Size

func (t *TypedefType) Size() int64

функция (*TypedefType) String

func (t *TypedefType) String() string

тип UcharType

UcharType представляет тип символа без знака.

type UcharType struct {
    BasicType
}

тип UintType

UintType представляет тип целого числа без знака.

type UintType struct {
    BasicType
}

тип UnspecifiedType 1.4

UnspecifiedType представляет неявный, неизвестный, неоднозначный или несуществующий тип.

type UnspecifiedType struct {
    BasicType
}

тип UnsupportedType 1.13

UnsupportedType — это заполнитель, возвращаемый в ситуациях, когда мы сталкиваемся с типом, который не поддерживается.

type UnsupportedType struct {
    CommonType
    Tag Tag
}

функция (*UnsupportedType) String 1.13

func (t *UnsupportedType) String() string

тип VoidType

VoidType представляет тип C void.

type VoidType struct {
    CommonType
}

функция (*VoidType) String

func (t *VoidType) String() string

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/debug/dwarf/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API