Package dwarf
Обзор
Пакет dwarf предоставляет доступ к отладочной информации DWARF, загруженной из исполняемых файлов, как определено в стандарте DWARF 2.0 по адресу http://dwarfstd.org/doc/dwarf-2.0.0.pdf.
Безопасность
Этот пакет не предназначен для защиты от вредоносных входных данных и находится вне сферы действия https://go.dev/security/policy. В частности, при разборе объектных файлов выполняется только базовая проверка. Поэтому следует проявлять осторожность при разборе недоверенных входных данных, так как разбор некорректно сформированных файлов может потребовать значительных ресурсов или вызвать панику.
Индекс
Файлы пакета
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/