pub struct Context<R: Reader> {
pub(crate) sections: Arc<Dwarf<R>>,
pub(crate) units: ResUnits<R>,
pub(crate) sup_units: SupUnits<R>,
}
Expand description
The state necessary to perform address to line translation.
Constructing a Context
is somewhat costly, so users should aim to reuse Context
s
when performing lookups for many addresses in the same executable.
Fields§
§sections: Arc<Dwarf<R>>
§units: ResUnits<R>
§sup_units: SupUnits<R>
Implementations§
source§impl<R: Reader> Context<R>
impl<R: Reader> Context<R>
sourcepub fn from_sections(
debug_abbrev: DebugAbbrev<R>,
debug_addr: DebugAddr<R>,
debug_aranges: DebugAranges<R>,
debug_info: DebugInfo<R>,
debug_line: DebugLine<R>,
debug_line_str: DebugLineStr<R>,
debug_ranges: DebugRanges<R>,
debug_rnglists: DebugRngLists<R>,
debug_str: DebugStr<R>,
debug_str_offsets: DebugStrOffsets<R>,
default_section: R,
) -> Result<Self, Error>
pub fn from_sections( debug_abbrev: DebugAbbrev<R>, debug_addr: DebugAddr<R>, debug_aranges: DebugAranges<R>, debug_info: DebugInfo<R>, debug_line: DebugLine<R>, debug_line_str: DebugLineStr<R>, debug_ranges: DebugRanges<R>, debug_rnglists: DebugRngLists<R>, debug_str: DebugStr<R>, debug_str_offsets: DebugStrOffsets<R>, default_section: R, ) -> Result<Self, Error>
Construct a new Context
from DWARF sections.
This method does not support using a supplementary object file.
sourcepub fn from_dwarf(sections: Dwarf<R>) -> Result<Context<R>, Error>
pub fn from_dwarf(sections: Dwarf<R>) -> Result<Context<R>, Error>
Construct a new Context
from an existing gimli::Dwarf
object.
sourcepub fn from_arc_dwarf(sections: Arc<Dwarf<R>>) -> Result<Context<R>, Error>
pub fn from_arc_dwarf(sections: Arc<Dwarf<R>>) -> Result<Context<R>, Error>
Construct a new Context
from an existing gimli::Dwarf
object.
source§impl<R: Reader> Context<R>
impl<R: Reader> Context<R>
sourcepub fn find_dwarf_and_unit(
&self,
probe: u64,
) -> LookupResult<impl LookupContinuation<Output = Option<UnitRef<'_, R>>, Buf = R>>
pub fn find_dwarf_and_unit( &self, probe: u64, ) -> LookupResult<impl LookupContinuation<Output = Option<UnitRef<'_, R>>, Buf = R>>
Find the DWARF unit corresponding to the given virtual memory address.
sourcepub fn find_location(&self, probe: u64) -> Result<Option<Location<'_>>, Error>
pub fn find_location(&self, probe: u64) -> Result<Option<Location<'_>>, Error>
Find the source file and line corresponding to the given virtual memory address.
sourcepub fn find_location_range(
&self,
probe_low: u64,
probe_high: u64,
) -> Result<LocationRangeIter<'_, R>, Error>
pub fn find_location_range( &self, probe_low: u64, probe_high: u64, ) -> Result<LocationRangeIter<'_, R>, Error>
Return source file and lines for a range of addresses. For each location it also returns the address and size of the range of the underlying instructions.
sourcepub fn find_frames(
&self,
probe: u64,
) -> LookupResult<impl LookupContinuation<Output = Result<FrameIter<'_, R>, Error>, Buf = R>>
pub fn find_frames( &self, probe: u64, ) -> LookupResult<impl LookupContinuation<Output = Result<FrameIter<'_, R>, Error>, Buf = R>>
Return an iterator for the function frames corresponding to the given virtual memory address.
If the probe address is not for an inline function then only one frame is returned.
If the probe address is for an inline function then the first frame corresponds to the innermost inline function. Subsequent frames contain the caller and call location, until an non-inline caller is reached.
sourcepub fn preload_units(
&self,
probe: u64,
) -> impl Iterator<Item = (SplitDwarfLoad<R>, impl FnOnce(Option<Arc<Dwarf<R>>>) -> Result<(), Error> + '_)>
pub fn preload_units( &self, probe: u64, ) -> impl Iterator<Item = (SplitDwarfLoad<R>, impl FnOnce(Option<Arc<Dwarf<R>>>) -> Result<(), Error> + '_)>
Preload units for probe
.
The iterator returns pairs of SplitDwarfLoad
s containing the
information needed to locate and load split DWARF for probe
and
a matching callback to invoke once that data is available.
If this method is called, and all of the returned closures are invoked,
addr2line guarantees that any future API call for the address probe
will not require the loading of any split DWARF.
const ADDRESS: u64 = 0xdeadbeef;
ctx.preload_units(ADDRESS).for_each(|(load, callback)| {
let dwo = do_split_dwarf_load(load);
callback(dwo);
});
let frames_iter = match ctx.find_frames(ADDRESS) {
LookupResult::Output(result) => result,
LookupResult::Load { .. } => unreachable!("addr2line promised we wouldn't get here"),
};
// ...