Documentation ¶
Overview ¶
Package frame contains data structures and related functions for parsing and searching through Dwarf .debug_frame data.
Index ¶
- Constants
- func DwarfEndian(infoSec []byte) binary.ByteOrder
- type CommonInformationEntry
- type CurrentFrameAddress
- type DWRule
- type FrameContext
- type FrameDescriptionEntries
- type FrameDescriptionEntry
- func (fde *FrameDescriptionEntry) Begin() uint64
- func (fde *FrameDescriptionEntry) Cover(addr uint64) bool
- func (fde *FrameDescriptionEntry) End() uint64
- func (fde *FrameDescriptionEntry) EstablishFrame(pc uint64) *FrameContext
- func (frame *FrameDescriptionEntry) LessThan(pc uint64) bool
- func (fde *FrameDescriptionEntry) ReturnAddressOffset(pc uint64) (frameOffset, returnAddressOffset int64)
Constants ¶
const ( DW_OP_addr = 0x03 DW_OP_const1s = 0x09 )
Operation opcodes
const ( DW_OP_const2u = 0x0a DW_OP_const2s = 0x0b DW_OP_const4u = iota 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_skip DW_OP_bra DW_OP_eq DW_OP_ge DW_OP_gt DW_OP_le DW_OP_lt DW_OP_ne )
const ( DW_OP_lit0 = 0x30 DW_OP_lit1 = 0x31 DW_OP_lit2 = iota 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 ( 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 )
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 }
Represents a Common Information Entry in the Dwarf .debug_frame section.
type CurrentFrameAddress ¶
type CurrentFrameAddress struct {
// contains filtered or unexported fields
}
type FrameContext ¶
type FrameContext struct {
// contains filtered or unexported fields
}
func (*FrameContext) CFAOffset ¶
func (fctx *FrameContext) CFAOffset() int64
func (*FrameContext) ExecuteDwarfProgram ¶
func (frame *FrameContext) ExecuteDwarfProgram()
func (*FrameContext) ExecuteUntilPC ¶
func (frame *FrameContext) ExecuteUntilPC(instructions []byte)
Execute dwarf instructions.
type FrameDescriptionEntries ¶
type FrameDescriptionEntries []*FrameDescriptionEntry
func NewFrameIndex ¶
func NewFrameIndex() FrameDescriptionEntries
func Parse ¶
func Parse(data []byte, order binary.ByteOrder) FrameDescriptionEntries
Parse takes in data (a byte slice) and returns a slice of commonInformationEntry structures. Each commonInformationEntry has a slice of frameDescriptionEntry structures.
func (FrameDescriptionEntries) FDEForPC ¶
func (fdes FrameDescriptionEntries) FDEForPC(pc uint64) (*FrameDescriptionEntry, error)
Returns the Frame Description Entry for the given PC.
type FrameDescriptionEntry ¶
type FrameDescriptionEntry struct { Length uint32 CIE *CommonInformationEntry Instructions []byte // contains filtered or unexported fields }
Represents a Frame Descriptor Entry in the Dwarf .debug_frame section.
func (*FrameDescriptionEntry) Begin ¶
func (fde *FrameDescriptionEntry) Begin() uint64
Address of first location for this frame.
func (*FrameDescriptionEntry) Cover ¶
func (fde *FrameDescriptionEntry) Cover(addr uint64) bool
Returns whether or not the given address is within the bounds of this frame.
func (*FrameDescriptionEntry) End ¶
func (fde *FrameDescriptionEntry) End() uint64
Address of last location for this frame.
func (*FrameDescriptionEntry) EstablishFrame ¶
func (fde *FrameDescriptionEntry) EstablishFrame(pc uint64) *FrameContext
Set up frame for the given PC.
func (*FrameDescriptionEntry) LessThan ¶
func (frame *FrameDescriptionEntry) LessThan(pc uint64) bool
func (*FrameDescriptionEntry) ReturnAddressOffset ¶
func (fde *FrameDescriptionEntry) ReturnAddressOffset(pc uint64) (frameOffset, returnAddressOffset int64)
Return the offset from the current SP that the return address is stored at.