Spec-Zone.ru › Go

Пакет 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
  • func (t *ArrayType) Size() int64
  • func (t *ArrayType) String() string
  • тип Attr
  • func (a Attr) GoString() string
  • func (i Attr) String() string
  • тип BasicType
  • func (b *BasicType) Basic() *BasicType
  • func (t *BasicType) String() string
  • тип BoolType
  • тип CharType
  • тип Class
  • func (i Class) GoString() string
  • func (i Class) String() string
  • тип CommonType
  • func (c *CommonType) Common() *CommonType
  • func (c *CommonType) Size() int64
  • тип ComplexType
  • тип Data
  • func New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, error)
  • func (d *Data) AddSection(name string, contents []byte) 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)
  • тип DecodeError
  • func (e DecodeError) Error() string
  • тип DotDotDotType
  • func (t *DotDotDotType) String() string
  • тип Entry
  • func (e *Entry) AttrField(a Attr) *Field
  • func (e *Entry) Val(a Attr) any
  • тип EnumType
  • func (t *EnumType) String() string
  • тип EnumValue
  • тип Field
  • тип FloatType
  • тип FuncType
  • func (t *FuncType) String() string
  • тип IntType
  • тип LineEntry
  • тип LineFile
  • тип LineReader
  • func (r *LineReader) Files() []*LineFile
  • 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
  • тип LineReaderPos
  • тип Offset
  • тип PtrType
  • func (t *PtrType) String() string
  • тип QualType
  • func (t *QualType) Size() int64
  • func (t *QualType) String() string
  • тип Reader
  • func (r *Reader) AddressSize() int
  • func (r *Reader) ByteOrder() binary.ByteOrder
  • func (r *Reader) Next() (*Entry, error)
  • func (r *Reader) Seek(off Offset)
  • func (r *Reader) SeekPC(pc uint64) (*Entry, error)
  • func (r *Reader) SkipChildren()
  • тип StructField
  • тип StructType
  • func (t *StructType) Defn() string
  • func (t *StructType) String() string
  • тип Tag
  • func (t Tag) GoString() string
  • func (i Tag) String() string
  • тип Type
  • тип TypedefType
  • func (t *TypedefType) Size() int64
  • func (t *TypedefType) String() string
  • тип UcharType
  • тип UintType
  • тип UnspecifiedType
  • тип UnsupportedType
  • func (t *UnsupportedType) String() string
  • тип VoidType
  • func (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[].
}

func (*ArrayType) Size

func (t *ArrayType) Size() int64

func (*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
)

func (Attr) GoString

func (a Attr) GoString() string

func (Attr) String

func (i Attr) String() string

тип BasicType

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

Дополнительные сведения об интерпретации полей BitSize/BitOffset/DataBitOffset см. в документации к StructField.

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

func (*BasicType) Basic

func (b *BasicType) Basic() *BasicType

func (*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
)

func (Class) GoString 1.5

func (i Class) GoString() string

func (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
}

func (*CommonType) Common

func (c *CommonType) Common() *CommonType

func (*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
}

func 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».

func (*Data) AddSection 1.14

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

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

func (*Data) AddTypes 1.3

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

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

func (*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). Диапазоны PC имеются только у некоторых типов записей, например TagCompileUnit или TagSubprogram; для остальных типов функция возвращает 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».

тип DecodeError

type DecodeError struct {
    Name   string
    Offset Offset
    Err    string
}

func (DecodeError) Error

func (e DecodeError) Error() string

тип DotDotDotType

DotDotDotType представляет вариативный параметр функции ...

type DotDotDotType struct {
    CommonType
}

func (*DotDotDotType) String

func (t *DotDotDotType) String() string

тип Entry

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)

тип EnumType

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

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

func (*EnumType) String

func (t *EnumType) String() string

тип EnumValue

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

type EnumValue struct {
    Name string
    Val  int64
}

тип 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
}

тип FloatType

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

type FloatType struct {
    BasicType
}

тип FuncType

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

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

func (*FuncType) String

func (t *FuncType) String() string

тип IntType

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

type IntType struct {
    BasicType
}

тип 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
}

тип 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
}

тип LineReader 1.5

LineReader считывает последовательность структур LineEntry из секции DWARF «line» для одной единицы компиляции. Записи LineEntry упорядочены по возрастанию PC, и каждая LineEntry содержит метаданные для инструкций от PC этой записи LineEntry до PC следующей LineEntry (не включая его). Для последней записи будет установлено поле LineEntry.EndSequence.

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 возвращает текущую позицию в таблице строк.

тип LineReaderPos 1.5

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

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

тип Offset

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

type Offset uint32

тип PtrType

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

type PtrType struct {
    CommonType
    Type Type
}

func (*PtrType) String

func (t *PtrType) String() string

тип QualType

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

type QualType struct {
    CommonType
    Qual string
    Type Type
}

func (*QualType) Size

func (t *QualType) Size() int64

func (*QualType) String

func (t *QualType) String() string

тип Reader

Reader позволяет считывать структуры Entry из секции DWARF «info». Структуры Entry организованы в виде дерева. Функция Reader.Next возвращает последовательные записи при прямом обходе дерева. Если у записи есть дочерние элементы, её поле Children будет равно true; далее следуют дочерние записи, завершающиеся Entry с 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. Если у этой Entry нет дочерних элементов или Reader.Next ещё не вызывался, SkipChildren ничего не делает.

тип StructField

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

Битовые поля

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

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

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

Если BitOffset не равен нулю, он задаёт количество битов между старшим битом единицы хранения, содержащей битовое поле, и старшим битом самого битового поля. Здесь «единица хранения» — это имя типа, указанное перед битовым полем (для поля «unsigned x:17» единицей хранения является «unsigned»). Значения BitOffset могут различаться в зависимости от порядка байтов в системе. BitOffset соответствует атрибуту DWARF DW_AT_bit_offset, устаревшему в 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
}

func (*StructType) Defn

func (t *StructType) Defn() string

func (*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
)

func (Tag) GoString

func (t Tag) GoString() string

func (Tag) String

func (i Tag) String() string

тип Type

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

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

тип TypedefType

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

type TypedefType struct {
    CommonType
    Type Type
}

func (*TypedefType) Size

func (t *TypedefType) Size() int64

func (*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
}

func (*UnsupportedType) String 1.13

func (t *UnsupportedType) String() string

тип VoidType

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

type VoidType struct {
    CommonType
}

func (*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