Documentation ¶
Overview ¶
nolint:stylecheck,deadcode,varcheck
nolint:stylecheck
Package frame contains data structures and related functions for parsing and searching through Dwarf .debug_frame data.
Index ¶
- Constants
- func CFAString(b byte) string
- func DwarfEndian(infoSec []byte) binary.ByteOrder
- type CommonInformationEntry
- type Context
- type DWRule
- type ErrNoFDEForPCError
- type FrameDescriptionEntries
- func (fdes FrameDescriptionEntries) Append(otherFDEs FrameDescriptionEntries) FrameDescriptionEntries
- func (fdes FrameDescriptionEntries) FDEForPC(pc uint64) (*FrameDescriptionEntry, error)
- func (t FrameDescriptionEntries) Len() int
- func (t FrameDescriptionEntries) Less(i, j int) bool
- func (t FrameDescriptionEntries) Swap(i, j int)
- type FrameDescriptionEntry
- type InstructionContext
- type InstructionContextIterator
- type RowState
- type Rule
- type StateStack
- type UnwindRegisters
Constants ¶
const ( DW_OP_addr = 0x03 DW_OP_deref = 0x06 )
Operation opcodes.
const ( DW_OP_const1u = iota + 0x08 DW_OP_const1s DW_OP_const2u DW_OP_const2s DW_OP_const4u DW_OP_const4s DW_OP_const8u DW_OP_const8s DW_OP_constu DW_OP_consts DW_OP_dup DW_OP_drop DW_OP_over DW_OP_pick DW_OP_swap DW_OP_rot DW_OP_xderef DW_OP_abs DW_OP_and DW_OP_div DW_OP_minus DW_OP_mod DW_OP_mul DW_OP_neg DW_OP_not DW_OP_or DW_OP_plus DW_OP_plus_uconst DW_OP_shl DW_OP_shr DW_OP_shra DW_OP_xor DW_OP_bra DW_OP_eq DW_OP_ge DW_OP_gt DW_OP_le DW_OP_lt DW_OP_ne DW_OP_skip )
const ( DW_OP_lit0 = iota + 0x30 DW_OP_lit1 DW_OP_lit2 DW_OP_lit3 DW_OP_lit4 DW_OP_lit5 DW_OP_lit6 DW_OP_lit7 DW_OP_lit8 DW_OP_lit9 DW_OP_lit10 DW_OP_lit11 DW_OP_lit12 DW_OP_lit13 DW_OP_lit14 DW_OP_lit15 DW_OP_lit16 DW_OP_lit17 DW_OP_lit18 DW_OP_lit19 DW_OP_lit20 DW_OP_lit21 DW_OP_lit22 DW_OP_lit23 DW_OP_lit24 DW_OP_lit25 DW_OP_lit26 DW_OP_lit27 DW_OP_lit28 DW_OP_lit29 DW_OP_lit30 DW_OP_lit31 DW_OP_reg0 DW_OP_reg1 DW_OP_reg2 DW_OP_reg3 DW_OP_reg4 DW_OP_reg5 DW_OP_reg6 DW_OP_reg7 DW_OP_reg8 DW_OP_reg9 DW_OP_reg10 DW_OP_reg11 DW_OP_reg12 DW_OP_reg13 DW_OP_reg14 DW_OP_reg15 DW_OP_reg16 DW_OP_reg17 DW_OP_reg18 DW_OP_reg19 DW_OP_reg20 DW_OP_reg21 DW_OP_reg22 DW_OP_reg23 DW_OP_reg24 DW_OP_reg25 DW_OP_reg26 DW_OP_reg27 DW_OP_reg28 DW_OP_reg29 DW_OP_reg30 DW_OP_reg31 DW_OP_breg0 DW_OP_breg1 DW_OP_breg2 DW_OP_breg3 DW_OP_breg4 DW_OP_breg5 DW_OP_breg6 DW_OP_breg7 DW_OP_breg8 DW_OP_breg9 DW_OP_breg10 DW_OP_breg11 DW_OP_breg12 DW_OP_breg13 DW_OP_breg14 DW_OP_breg15 DW_OP_breg16 DW_OP_breg17 DW_OP_breg18 DW_OP_breg19 DW_OP_breg20 DW_OP_breg21 DW_OP_breg22 DW_OP_breg23 DW_OP_breg24 DW_OP_breg25 DW_OP_breg26 DW_OP_breg27 DW_OP_breg28 DW_OP_breg29 DW_OP_breg30 DW_OP_breg31 DW_OP_regx DW_OP_fbreg DW_OP_bregx DW_OP_piece DW_OP_deref_size DW_OP_xderef_size DW_OP_nop DW_OP_push_object_address DW_OP_call2 DW_OP_call4 DW_OP_call_ref DW_OP_form_tls_address DW_OP_call_frame_cfa DW_OP_bit_piece DW_OP_lo_user = 0xe0 DW_OP_hi_user = 0xff )
const ( X86_64FramePointer = 6 // $rbp X86_64StackPointer = 7 // $rsp )
From 3.4.1 Initial Stack and Register State https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf
const ( DW_CFA_nop = 0x0 // No ops DW_CFA_set_loc = 0x01 // op1: address DW_CFA_advance_loc1 = iota // op1: 1-bytes delta DW_CFA_advance_loc2 // op1: 2-byte delta DW_CFA_advance_loc4 // op1: 4-byte delta DW_CFA_offset_extended // op1: ULEB128 register, op2: ULEB128 offset DW_CFA_restore_extended // op1: ULEB128 register DW_CFA_undefined // op1: ULEB128 register DW_CFA_same_value // op1: ULEB128 register DW_CFA_register // op1: ULEB128 register, op2: ULEB128 register DW_CFA_remember_state // No ops DW_CFA_restore_state // No ops DW_CFA_def_cfa // op1: ULEB128 register, op2: ULEB128 offset DW_CFA_def_cfa_register // op1: ULEB128 register DW_CFA_def_cfa_offset // op1: ULEB128 offset DW_CFA_def_cfa_expression // op1: BLOCK DW_CFA_expression // op1: ULEB128 register, op2: BLOCK DW_CFA_offset_extended_sf // op1: ULEB128 register, op2: SLEB128 BLOCK DW_CFA_def_cfa_sf // op1: ULEB128 register, op2: SLEB128 offset DW_CFA_def_cfa_offset_sf // op1: SLEB128 offset DW_CFA_val_offset // op1: ULEB128, op2: ULEB128 DW_CFA_val_offset_sf // op1: ULEB128, op2: SLEB128 DW_CFA_val_expression // op1: ULEB128, op2: BLOCK DW_CFA_lo_user = 0x1c // op1: BLOCK DW_CFA_hi_user = 0x3f // op1: ULEB128 register, op2: BLOCK DW_CFA_advance_loc = (0x1 << 6) // High 2 bits: 0x1, low 6: delta DW_CFA_offset = (0x2 << 6) // High 2 bits: 0x2, low 6: register DW_CFA_restore = (0x3 << 6) // High 2 bits: 0x3, low 6: register // TODO(kakkoyun): Find corresponding values in the spec. DW_CFA_MIPS_advance_loc8 = 0x1d DW_CFA_GNU_window_save = 0x2d DW_CFA_GNU_args_size = 0x2e DW_CFA_GNU_negative_offset_extended = 0x2f )
Instructions used to recreate the table from the .debug_frame data.
Variables ¶
This section is empty.
Functions ¶
func DwarfEndian ¶
DwarfEndian determines the endianness of the DWARF by using the version number field in the debug_info section Trick borrowed from "debug/dwarf".New().
Types ¶
type CommonInformationEntry ¶
type CommonInformationEntry struct { Length uint32 CIE_id uint32 Version uint8 Augmentation string CodeAlignmentFactor uint64 DataAlignmentFactor int64 ReturnAddressRegister uint64 InitialInstructions []byte // contains filtered or unexported fields }
CommonInformationEntry represents a Common Information Entry in the Dwarf .debug_frame section.
type Context ¶
type Context struct {
// contains filtered or unexported fields
}
Context represents a function.
func NewContext ¶ added in v0.11.0
func NewContext() *Context
func (*Context) Execute ¶
func (ctx *Context) Execute(instructions []byte) *InstructionContextIterator
Execute execute dwarf instructions.
type ErrNoFDEForPCError ¶
type ErrNoFDEForPCError struct {
PC uint64
}
ErrNoFDEForPCError FDE for PC not found error.
func (*ErrNoFDEForPCError) Error ¶
func (err *ErrNoFDEForPCError) Error() string
type FrameDescriptionEntries ¶
type FrameDescriptionEntries []*FrameDescriptionEntry
func Parse ¶
func Parse(data []byte, order binary.ByteOrder, staticBase uint64, ptrSize int, ehFrameAddr uint64) (FrameDescriptionEntries, error)
Parse takes in data (a byte slice) and returns FrameDescriptionEntries, which is a slice of FrameDescriptionEntry. Each FrameDescriptionEntry has a pointer to CommonInformationEntry. If ehFrameAddr is not zero the .eh_frame format will be used, a minor variant of DWARF described at https://www.airs.com/blog/archives/460. The value of ehFrameAddr will be used as the address at which eh_frame will be mapped into memory.
func (FrameDescriptionEntries) Append ¶
func (fdes FrameDescriptionEntries) Append(otherFDEs FrameDescriptionEntries) FrameDescriptionEntries
Append appends otherFDEs to fdes and returns the result.
func (FrameDescriptionEntries) FDEForPC ¶
func (fdes FrameDescriptionEntries) FDEForPC(pc uint64) (*FrameDescriptionEntry, error)
FDEForPC returns the Frame Description Entry for the given PC.
func (FrameDescriptionEntries) Len ¶ added in v0.12.0
func (t FrameDescriptionEntries) Len() int
func (FrameDescriptionEntries) Less ¶ added in v0.12.0
func (t FrameDescriptionEntries) Less(i, j int) bool
func (FrameDescriptionEntries) Swap ¶ added in v0.12.0
func (t FrameDescriptionEntries) Swap(i, j int)
type FrameDescriptionEntry ¶
type FrameDescriptionEntry struct { Length uint32 CIE *CommonInformationEntry Instructions []byte // contains filtered or unexported fields }
FrameDescriptionEntry represents a Frame Descriptor Entry in the Dwarf .debug_frame section.
func (*FrameDescriptionEntry) Begin ¶
func (fde *FrameDescriptionEntry) Begin() uint64
Begin returns address of first location for this frame.
func (*FrameDescriptionEntry) Cover ¶
func (fde *FrameDescriptionEntry) Cover(addr uint64) bool
Cover returns whether or not the given address is within the bounds of this frame.
func (*FrameDescriptionEntry) End ¶
func (fde *FrameDescriptionEntry) End() uint64
End returns address of last location for this frame.
func (*FrameDescriptionEntry) Translate ¶
func (fde *FrameDescriptionEntry) Translate(delta uint64)
Translate moves the beginning of fde forward by delta.
type InstructionContext ¶
type InstructionContext struct { CFA DWRule Regs UnwindRegisters RetAddrReg uint64 // contains filtered or unexported fields }
InstructionContext represents each object code instruction that we have unwind information for.
func (*InstructionContext) Loc ¶
func (instructionContext *InstructionContext) Loc() uint64
type InstructionContextIterator ¶ added in v0.11.0
type InstructionContextIterator struct {
// contains filtered or unexported fields
}
func ExecuteDwarfProgram ¶
func ExecuteDwarfProgram(fde *FrameDescriptionEntry, context *Context) *InstructionContextIterator
ExecuteDwarfProgram evaluates the unwind opcodes for a function.
func (*InstructionContextIterator) HasNext ¶ added in v0.11.0
func (ici *InstructionContextIterator) HasNext() bool
func (*InstructionContextIterator) Next ¶ added in v0.11.0
func (ici *InstructionContextIterator) Next() *InstructionContext
type RowState ¶
type RowState struct {
// contains filtered or unexported fields
}
RowState is a stack where `DW_CFA_remember_state` pushes its CFA and registers state and `DW_CFA_restore_state` pops them.
type StateStack ¶
type StateStack struct {
// contains filtered or unexported fields
}