Crate gimli [] [src]

A lazy, zero-copy parser for the DWARF debugging information format.

  • Zero-copy: everything is just a reference to the original input buffer. No copies of the input data ever get made.

  • Lazy: only the compilation units' entries that you iterate over get parsed, and only as deep as you ask. Skip over a compilation unit and its entries don't get parsed.

  • Cross-platform: gimli isn't coupled to any platform or object file format. Use your own ELF parser on Linux or a Mach-O parser on OSX.

    • Unsure which object file parser to use? Try the cross-platform object crate.

This library primarily targets the fourth edition of the standard (the most recent, at time of writing).

Example Usage

Print out all of the functions in the debuggee program:

extern crate gimli;

// Read the .debug_info and .debug_abbrev sections with whatever object
// loader you're using.
let debug_info = gimli::DebugInfo::<gimli::LittleEndian>::new(read_debug_info());
let debug_abbrev = gimli::DebugAbbrev::<gimli::LittleEndian>::new(read_debug_abbrev());

// Iterate over all compilation units.
let mut iter = debug_info.units();
while let Some(unit) = try!(iter.next()) {
    // Parse the abbreviations for this compilation unit.
    let abbrevs = try!(unit.abbreviations(debug_abbrev));

    // Iterate over all of this compilation unit's entries.
    let mut entries = unit.entries(&abbrevs);
    while let Some((_, entry)) = try!(entries.next_dfs()) {
        // If we find an entry for a function, print it.
        if entry.tag() == gimli::DW_TAG_subprogram {
            println!("Found a function: {:?}", entry);
        }
    }
}

See the example programs for complete examples.

API Structure

  • Basic familiarity with DWARF is assumed.

  • Each section gets its own type. Consider these types the entry points to the library:

  • Each section type exposes methods for accessing the debugging data encoded in that section. For example, the DebugInfo struct has the units method for iterating over the compilation units defined within it.

  • Offsets into a section are strongly typed: an offset into .debug_info is the DebugInfoOffset type. It cannot be used to index into the DebugLine type because DebugLine represents the .debug_line section. There are similar types for offsets relative to a compilation unit rather than a section.

Using with FallibleIterator

The standard library's Iterator trait and related APIs do not play well with iterators where the next operation is fallible. One can make the Iterator's associated Item type be a Result<T, E>, however the provided methods cannot gracefully handle the case when an Err is returned.

This situation led to the fallible-iterator crate's existence. You can read more of the rationale for its existence in its docs. The crate provides the helpers you have come to expect (eg map, filter, etc) for iterators that can fail.

gimli's many lazy parsing iterators are a perfect match for the fallible-iterator crate's FallibleIterator trait because parsing is not done eagerly. Parse errors later in the input might only be discovered after having iterated through many items.

To use gimli iterators with FallibleIterator, import the crate and trait into your code:

// Add the `fallible-iterator` crate. Don't forget to add it to your
// `Cargo.toml`, too!
extern crate fallible_iterator;
extern crate gimli;

// Use the `FallibleIterator` trait so its methods are in scope!
use fallible_iterator::FallibleIterator;
use gimli::{DebugAranges, LittleEndian};

fn find_sum_of_address_range_lengths(aranges: DebugAranges<LittleEndian>)
    -> gimli::Result<u64>
{
    // `DebugAranges::items` returns a `FallibleIterator`!
    aranges.items()
        // `map` is provided by `FallibleIterator`!
        .map(|arange| arange.length())
        // `fold` is provided by `FallibleIterator`!
        .fold(0, |sum, len| sum + len)
}

Structs

Abbreviation

An abbreviation describes the shape of a DebuggingInformationEntry's type: its code, tag type, whether it has children, and its set of attributes.

Abbreviations

A set of type abbreviations.

ArangeEntry

A single parsed arange.

Attribute

An attribute in a DebuggingInformationEntry, consisting of a name and associated value.

AttributeSpecification

The description of an attribute in an abbreviated type. It is a pair of name and form.

AttrsIter

An iterator over a particular entry's attributes.

CallFrameInstructionIter

A lazy iterator parsing call frame instructions.

CfiEntriesIter

An iterator over CIE and FDE entries in a .debug_frame section.

CommonInformationEntry

A Common Information Entry holds information that is shared among many Frame Description Entries. There is at least one CIE in every non-empty .debug_frame section.

DebugAbbrev

The DebugAbbrev struct represents the abbreviations describing DebuggingInformationEntrys' attribute names and forms found in the .debug_abbrev section.

DebugAbbrevOffset

An offset into the .debug_abbrev section.

DebugFrame

The DebugFrame struct contains the source location to instruction mapping found in the .debug_frame section.

DebugFrameOffset

An offset into the .debug_frame section.

DebugInfo

The DebugInfo struct represents the DWARF debugging information found in the .debug_info section.

DebugInfoOffset

An offset into the .debug_info section.

DebugLine

The DebugLine struct contains the source location to instruction mapping found in the .debug_line section.

DebugLineOffset

An offset into the .debug_line section.

DebugLoc

The DebugLoc struct represents the DWARF strings found in the .debug_loc section.

DebugLocOffset

An offset into the .debug_loc section.

DebugMacinfoOffset

An offset into the .debug_macinfo section.

DebugRanges

The DebugRanges struct represents the DWARF strings found in the .debug_ranges section.

DebugRangesOffset

An offset into the .debug_ranges section.

DebugStr

The DebugStr struct represents the DWARF strings found in the .debug_str section.

DebugStrOffset

An offset into the .debug_str section.

DebugTypeSignature

A type signature as used in the .debug_types section.

DebugTypes

The DebugTypes struct represents the DWARF type information found in the .debug_types section.

DebugTypesOffset

An offset into the .debug_types section.

DebuggingInformationEntry

A Debugging Information Entry (DIE).

DwAccess
DwAddr
DwAt
DwAte
DwCc
DwCfa
DwChildren
DwDs
DwDsc
DwEnd
DwForm
DwId
DwInl
DwLang
DwLne
DwLns
DwOp
DwOrd
DwTag
DwVirtuality
DwVis
EndianBuf

A &[u8] slice with compile-time endianity metadata.

EntriesCursor

A cursor into the Debugging Information Entries tree for a compilation unit.

Evaluation

A DWARF expression evaluation.

FileEntry

An entry in the LineNumberProgramHeader's file_names set.

FrameDescriptionEntry

A FrameDescriptionEntry is a set of CFA instructions for an address range.

InitializedUnwindContext

An initialized unwinding context.

LineNumberProgramHeader

A header for a line number program in the .debug_line section, as defined in section 6.2.4 of the standard.

LineNumberRow

A row in the line number program's resulting matrix.

LocationListEntry

A location list entry from the .debug_loc section.

LocationListIter

An iterator over a location list.

OpcodesIter

An iterator yielding parsed opcodes.

PartialFrameDescriptionEntry

A partially parsed FrameDescriptionEntry.

Piece

The description of a single piece of the result of a DWARF expression.

PubNamesEntry

A single parsed pubname.

PubTypesEntry

A single parsed pubtype.

Range

An address range from the .debug_ranges section.

RangesIter

An iterator over an address range list.

RawLocationListIter

A raw iterator over a location list.

RawRangesIter

A raw iterator over an address range list.

StateMachine

Executes a LineNumberProgram to recreate the matrix mapping to and from instructions to source locations.

TypeUnitHeader

The header of a type unit's debugging information.

TypeUnitHeadersIter

An iterator over the type-units of this .debug_types section.

UninitializedUnwindContext

Common context needed when evaluating the call frame unwinding information.

UnitHeader

The header of a compilation unit's debugging information.

UnitHeadersIter

An iterator over the compilation- and partial-units of a section.

UnitOffset

An offset into the current compilation or type unit.

UnwindTable

The UnwindTable iteratively evaluates a FrameDescriptionEntry's CallFrameInstruction program, yielding the each row one at a time.

UnwindTableRow

A row in the virtual unwind table that describes how to find the values of the registers in the previous frame for a range of PC addresses.

Enums

AttributeValue

The value of an attribute in a DebuggingInformationEntry.

BigEndian

Big endian byte order.

CallFrameInstruction

A parsed call frame instruction.

CfaRule

The canonical frame address (CFA) recovery rules.

CieOrFde

Either a CommonInformationEntry (CIE) or a FrameDescriptionEntry (FDE).

ColumnType

The type of column that a row is referring to.

DieReference

A reference to a DIE, either relative to the current CU or relative to the section.

Error

An error that occurred when parsing.

Format

Whether the format of a compilation unit is 32- or 64-bit.

LittleEndian

Little endian byte order.

Location

A single location of a piece of the result of a DWARF expression.

Opcode

A parsed line number program opcode.

Operation

A single decoded DWARF expression operation.

RegisterRule

An entry in the abstract CFI table that describes how to find the value of a register.

Constants

DW_ACCESS_private
DW_ACCESS_protected
DW_ACCESS_public
DW_ADDR_none
DW_ATE_UTF
DW_ATE_address
DW_ATE_boolean
DW_ATE_complex_float
DW_ATE_decimal_float
DW_ATE_edited
DW_ATE_float
DW_ATE_hi_user
DW_ATE_imaginary_float
DW_ATE_lo_user
DW_ATE_numeric_string
DW_ATE_packed_decimal
DW_ATE_signed
DW_ATE_signed_char
DW_ATE_signed_fixed
DW_ATE_unsigned
DW_ATE_unsigned_char
DW_ATE_unsigned_fixed
DW_AT_abstract_origin
DW_AT_accessibility
DW_AT_address_class
DW_AT_allocated
DW_AT_artificial
DW_AT_associated
DW_AT_base_types
DW_AT_binary_scale
DW_AT_bit_offset
DW_AT_bit_size
DW_AT_bit_stride
DW_AT_byte_size
DW_AT_byte_stride
DW_AT_call_column
DW_AT_call_file
DW_AT_call_line
DW_AT_calling_convention
DW_AT_common_reference
DW_AT_comp_dir
DW_AT_const_expr
DW_AT_const_value
DW_AT_containing_type
DW_AT_count
DW_AT_data_bit_offset
DW_AT_data_location
DW_AT_data_member_location
DW_AT_decimal_scale
DW_AT_decimal_sign
DW_AT_decl_column
DW_AT_decl_file
DW_AT_decl_line
DW_AT_declaration
DW_AT_default_value
DW_AT_description
DW_AT_digit_count
DW_AT_discr
DW_AT_discr_list
DW_AT_discr_value
DW_AT_elemental
DW_AT_encoding
DW_AT_endianity
DW_AT_entry_pc
DW_AT_enum_class
DW_AT_explicit
DW_AT_extension
DW_AT_external
DW_AT_frame_base
DW_AT_friend
DW_AT_hi_user
DW_AT_high_pc
DW_AT_identifier_case
DW_AT_import
DW_AT_inline
DW_AT_is_optional
DW_AT_language
DW_AT_linkage_name
DW_AT_lo_user
DW_AT_location
DW_AT_low_pc
DW_AT_lower_bound
DW_AT_macro_info
DW_AT_main_subprogram
DW_AT_mutable
DW_AT_name
DW_AT_namelist_item
DW_AT_null
DW_AT_object_pointer
DW_AT_ordering
DW_AT_picture_string
DW_AT_priority
DW_AT_producer
DW_AT_prototyped
DW_AT_pure
DW_AT_ranges
DW_AT_recursive
DW_AT_return_addr
DW_AT_segment
DW_AT_sibling
DW_AT_signature
DW_AT_small
DW_AT_specification
DW_AT_start_scope
DW_AT_static_link
DW_AT_stmt_list
DW_AT_string_length
DW_AT_threads_scaled
DW_AT_trampoline
DW_AT_type
DW_AT_upper_bound
DW_AT_use_UTF8
DW_AT_use_location
DW_AT_variable_parameter
DW_AT_virtuality
DW_AT_visibility
DW_AT_vtable_elem_location
DW_CC_hi_user
DW_CC_lo_user
DW_CC_nocall
DW_CC_normal
DW_CC_program
DW_CFA_advance_loc
DW_CFA_advance_loc1
DW_CFA_advance_loc2
DW_CFA_advance_loc4
DW_CFA_def_cfa
DW_CFA_def_cfa_expression
DW_CFA_def_cfa_offset
DW_CFA_def_cfa_offset_sf
DW_CFA_def_cfa_register
DW_CFA_def_cfa_sf
DW_CFA_expression
DW_CFA_hi_user
DW_CFA_lo_user
DW_CFA_nop
DW_CFA_offset
DW_CFA_offset_extended
DW_CFA_offset_extended_sf
DW_CFA_register
DW_CFA_remember_state
DW_CFA_restore
DW_CFA_restore_extended
DW_CFA_restore_state
DW_CFA_same_value
DW_CFA_set_loc
DW_CFA_undefined
DW_CFA_val_expression
DW_CFA_val_offset
DW_CFA_val_offset_sf
DW_CHILDREN_no
DW_CHILDREN_yes
DW_DSC_label
DW_DSC_range
DW_DS_leading_overpunch
DW_DS_leading_separate
DW_DS_trailing_overpunch
DW_DS_trailing_separate
DW_DS_unsigned
DW_END_hi_user
DW_END_lo_user
DW_END_private
DW_END_protected
DW_END_public
DW_FORM_addr
DW_FORM_block
DW_FORM_block1
DW_FORM_block2
DW_FORM_block4
DW_FORM_data1
DW_FORM_data2
DW_FORM_data4
DW_FORM_data8
DW_FORM_exprloc
DW_FORM_flag
DW_FORM_flag_present
DW_FORM_indirect
DW_FORM_null
DW_FORM_ref1
DW_FORM_ref2
DW_FORM_ref4
DW_FORM_ref8
DW_FORM_ref_addr
DW_FORM_ref_sig8
DW_FORM_ref_udata
DW_FORM_sdata
DW_FORM_sec_offset
DW_FORM_string
DW_FORM_strp
DW_FORM_udata
DW_ID_case_insensitive
DW_ID_case_sensitive
DW_ID_down_case
DW_ID_up_case
DW_INL_declared_inlined
DW_INL_declared_not_inlined
DW_INL_inlined
DW_INL_not_inlined
DW_LANG_Ada83
DW_LANG_Ada95
DW_LANG_C
DW_LANG_C89
DW_LANG_C99
DW_LANG_C_plus_plus
DW_LANG_Cobol74
DW_LANG_Cobol85
DW_LANG_D
DW_LANG_Fortran77
DW_LANG_Fortran90
DW_LANG_Fortran95
DW_LANG_Java
DW_LANG_Modula2
DW_LANG_ObjC
DW_LANG_ObjC_plus_plus
DW_LANG_PLI
DW_LANG_Pascal83
DW_LANG_Python
DW_LANG_UPC
DW_LANG_hi_user
DW_LANG_lo_user
DW_LNE_define_file
DW_LNE_end_sequence
DW_LNE_hi_user
DW_LNE_lo_user
DW_LNE_set_address
DW_LNE_set_discriminator
DW_LNS_advance_line
DW_LNS_advance_pc
DW_LNS_const_add_pc
DW_LNS_copy
DW_LNS_fixed_advance_pc
DW_LNS_negate_stmt
DW_LNS_set_basic_block
DW_LNS_set_column
DW_LNS_set_epilogue_begin
DW_LNS_set_file
DW_LNS_set_isa
DW_LNS_set_prologue_end
DW_OP_GNU_push_tls_address
DW_OP_abs
DW_OP_addr
DW_OP_and
DW_OP_bit_piece
DW_OP_bra
DW_OP_breg0
DW_OP_breg1
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_breg2
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_breg3
DW_OP_breg30
DW_OP_breg31
DW_OP_breg4
DW_OP_breg5
DW_OP_breg6
DW_OP_breg7
DW_OP_breg8
DW_OP_breg9
DW_OP_bregx
DW_OP_call2
DW_OP_call4
DW_OP_call_frame_cfa
DW_OP_call_ref
DW_OP_const1s
DW_OP_const1u
DW_OP_const2s
DW_OP_const2u
DW_OP_const4s
DW_OP_const4u
DW_OP_const8s
DW_OP_const8u
DW_OP_consts
DW_OP_constu
DW_OP_deref
DW_OP_deref_size
DW_OP_div
DW_OP_drop
DW_OP_dup
DW_OP_eq
DW_OP_fbreg
DW_OP_form_tls_address
DW_OP_ge
DW_OP_gt
DW_OP_implicit_value
DW_OP_le
DW_OP_lit0
DW_OP_lit1
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_lit2
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_lit3
DW_OP_lit30
DW_OP_lit31
DW_OP_lit4
DW_OP_lit5
DW_OP_lit6
DW_OP_lit7
DW_OP_lit8
DW_OP_lit9
DW_OP_lt
DW_OP_minus
DW_OP_mod
DW_OP_mul
DW_OP_ne
DW_OP_neg
DW_OP_nop
DW_OP_not
DW_OP_or
DW_OP_over
DW_OP_pick
DW_OP_piece
DW_OP_plus
DW_OP_plus_uconst
DW_OP_push_object_address
DW_OP_reg0
DW_OP_reg1
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_reg2
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_reg3
DW_OP_reg30
DW_OP_reg31
DW_OP_reg4
DW_OP_reg5
DW_OP_reg6
DW_OP_reg7
DW_OP_reg8
DW_OP_reg9
DW_OP_regx
DW_OP_rot
DW_OP_shl
DW_OP_shr
DW_OP_shra
DW_OP_skip
DW_OP_stack_value
DW_OP_swap
DW_OP_xderef
DW_OP_xderef_size
DW_OP_xor
DW_ORD_col_major
DW_ORD_row_major
DW_TAG_access_declaration
DW_TAG_array_type
DW_TAG_base_type
DW_TAG_catch_block
DW_TAG_class_type
DW_TAG_common_block
DW_TAG_common_inclusion
DW_TAG_compile_unit
DW_TAG_condition
DW_TAG_const_type
DW_TAG_constant
DW_TAG_dwarf_procedure
DW_TAG_entry_point
DW_TAG_enumeration_type
DW_TAG_enumerator
DW_TAG_file_type
DW_TAG_formal_parameter
DW_TAG_friend
DW_TAG_hi_user
DW_TAG_imported_declaration
DW_TAG_imported_module
DW_TAG_imported_unit
DW_TAG_inheritance
DW_TAG_inlined_subroutine
DW_TAG_interface_type
DW_TAG_label
DW_TAG_lexical_block
DW_TAG_lo_user
DW_TAG_member
DW_TAG_module
DW_TAG_namelist
DW_TAG_namelist_item
DW_TAG_namespace
DW_TAG_null
DW_TAG_packed_type
DW_TAG_partial_unit
DW_TAG_pointer_type
DW_TAG_ptr_to_member_type
DW_TAG_reference_type
DW_TAG_restrict_type
DW_TAG_rvalue_reference_type
DW_TAG_set_type
DW_TAG_shared_type
DW_TAG_string_type
DW_TAG_structure_type
DW_TAG_subprogram
DW_TAG_subrange_type
DW_TAG_subroutine_type
DW_TAG_template_alias
DW_TAG_template_type_parameter
DW_TAG_template_value_parameter
DW_TAG_thrown_type
DW_TAG_try_block
DW_TAG_type_unit
DW_TAG_typedef
DW_TAG_union_type
DW_TAG_unspecified_parameters
DW_TAG_unspecified_type
DW_TAG_variable
DW_TAG_variant
DW_TAG_variant_part
DW_TAG_volatile_type
DW_TAG_with_stmt
DW_VIRTUALITY_none
DW_VIRTUALITY_pure_virtual
DW_VIRTUALITY_virtual
DW_VIS_exported
DW_VIS_local
DW_VIS_qualified

Traits

Endianity

A trait describing the endianity of some buffer.

EvaluationContext

Supply information to a DWARF expression evaluation.

Type Definitions

ArangeEntryIter

An iterator over the aranges from a .debug_aranges section.

DebugAranges

The DebugAranges struct represents the DWARF address range information found in the .debug_aranges section.

DebugPubNames

The DebugPubNames struct represents the DWARF public names information found in the .debug_pubnames section.

DebugPubTypes

The DebugPubTypes struct represents the DWARF public types information found in the .debug_types section.

NativeEndian

The native endianity for the target platform.

PubNamesEntryIter

An iterator over the pubnames from a .debug_pubnames section.

PubTypesEntryIter

An iterator over the pubtypes from a .debug_pubtypes section.

Result

The result of a parse.