pub struct VariableCache { /* private fields */ }
debug
only.Expand description
VariableCache stores available Variable
s, and provides methods to create and navigate the parent-child relationships of the Variables.
Implementations§
Source§impl VariableCache
impl VariableCache
Sourcepub fn new_dwarf_cache(
entries_offset: UnitOffset,
name: VariableName,
unit_info: &UnitInfo,
) -> Result<Self, DebugError>
pub fn new_dwarf_cache( entries_offset: UnitOffset, name: VariableName, unit_info: &UnitInfo, ) -> Result<Self, DebugError>
Create a variable cache based on DWARF debug information
The entries_offset
and unit_info
values are used to
extract the variable information from the debug information.
The entries form a tree, only entries below the entry
at entries_offset
are considered when filling the cache.
Sourcepub fn new_static_cache() -> Self
pub fn new_static_cache() -> Self
Create a cache for static variables.
This will be filled with static variables when cache_deferred_variables
is called.
Sourcepub fn root_variable(&self) -> &Variable
pub fn root_variable(&self) -> &Variable
Get the root variable of the cache
Sourcepub fn create_variable(
&mut self,
parent_key: ObjectRef,
unit_info: Option<&UnitInfo>,
) -> Result<Variable, DebugError>
pub fn create_variable( &mut self, parent_key: ObjectRef, unit_info: Option<&UnitInfo>, ) -> Result<Variable, DebugError>
Create a new variable in the cache
Sourcepub fn add_variable(
&mut self,
parent_key: ObjectRef,
cache_variable: &mut Variable,
) -> Result<(), DebugError>
pub fn add_variable( &mut self, parent_key: ObjectRef, cache_variable: &mut Variable, ) -> Result<(), DebugError>
Add a variable to the cache
The parent key must exist in the cache, and the variable must not have a key assigned yet.
Sourcepub fn update_variable(
&mut self,
cache_variable: &Variable,
) -> Result<(), DebugError>
pub fn update_variable( &mut self, cache_variable: &Variable, ) -> Result<(), DebugError>
Update a variable in the cache
This function does not update the value of the variable.
Sourcepub fn get_variable_by_key(&self, variable_key: ObjectRef) -> Option<Variable>
pub fn get_variable_by_key(&self, variable_key: ObjectRef) -> Option<Variable>
Retrieve a clone of a specific Variable
, using the variable_key
.
Sourcepub fn get_variable_by_name_and_parent(
&self,
variable_name: &VariableName,
parent_key: ObjectRef,
) -> Option<Variable>
pub fn get_variable_by_name_and_parent( &self, variable_name: &VariableName, parent_key: ObjectRef, ) -> Option<Variable>
Retrieve a clone of a specific Variable
, using the name
and parent_key
.
If there is more than one, it will be logged (tracing::error!), and only the last will be returned.
Sourcepub fn get_variable_by_name(
&self,
variable_name: &VariableName,
) -> Option<Variable>
pub fn get_variable_by_name( &self, variable_name: &VariableName, ) -> Option<Variable>
Retrieve a clone of a specific Variable
, using the name
.
If there is more than one, it will be logged (tracing::warn!), and only the first will be returned.
It is possible for a hierarchy of variables in a cache to have duplicate names under different parents.
Sourcepub fn get_children(
&self,
parent_key: ObjectRef,
) -> impl Iterator<Item = &Variable> + Clone
pub fn get_children( &self, parent_key: ObjectRef, ) -> impl Iterator<Item = &Variable> + Clone
Retrieve clone
d version of all the children of a Variable
.
If parent_key == None
, it will return all the top level variables (no parents) in this cache.
Sourcepub fn has_children(&self, parent_variable: &Variable) -> bool
pub fn has_children(&self, parent_variable: &Variable) -> bool
Check if variable has children. If the variable doesn’t exist, it will return false.
Sourcepub fn adopt_grand_children(
&mut self,
parent_variable: &Variable,
obsolete_child_variable: &Variable,
) -> Result<(), Error>
pub fn adopt_grand_children( &mut self, parent_variable: &Variable, obsolete_child_variable: &Variable, ) -> Result<(), Error>
Sometimes DWARF uses intermediate nodes that are not part of the coded variable structure.
When we encounter them, the children of such intermediate nodes are assigned to the parent of the intermediate node, and we discard the intermediate nodes from the DebugInfo::VariableCache
Similarly, while resolving VariableNodeType::is_deferred(), i.e. ‘lazy load’ of variables, we need to create intermediate variables that are eliminated here.
NOTE: For all other situations, this function will silently do nothing.
Sourcepub fn remove_cache_entry_children(
&mut self,
parent_variable_key: ObjectRef,
) -> Result<(), Error>
pub fn remove_cache_entry_children( &mut self, parent_variable_key: ObjectRef, ) -> Result<(), Error>
Removing an entry’s children from the VariableCache
will recursively remove all their children
Sourcepub fn remove_cache_entry(
&mut self,
variable_key: ObjectRef,
) -> Result<(), Error>
pub fn remove_cache_entry( &mut self, variable_key: ObjectRef, ) -> Result<(), Error>
Removing an entry from the VariableCache
will recursively remove all its children
Sourcepub fn recurse_deferred_variables(
&mut self,
debug_info: &DebugInfo,
memory: &mut dyn MemoryInterface,
max_recursion_depth: usize,
frame_info: StackFrameInfo<'_>,
)
pub fn recurse_deferred_variables( &mut self, debug_info: &DebugInfo, memory: &mut dyn MemoryInterface, max_recursion_depth: usize, frame_info: StackFrameInfo<'_>, )
Recursively process the deferred variables in the variable cache, and add their children to the cache. Enforce a max level, so that we don’t recurse infinitely on circular references.
Sourcepub fn get_discrete_memory_ranges(&self) -> Vec<Range<u64>>
pub fn get_discrete_memory_ranges(&self) -> Vec<Range<u64>>
Traverse the VariableCache
and return a Vec of all the memory ranges that are referenced by the variables.
This is used to determine which memory ranges to read from the target when creating a ‘default’ crate::CoreDump
.
Trait Implementations§
Source§impl Clone for VariableCache
impl Clone for VariableCache
Source§fn clone(&self) -> VariableCache
fn clone(&self) -> VariableCache
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for VariableCache
impl Debug for VariableCache
Source§impl PartialEq for VariableCache
impl PartialEq for VariableCache
Source§impl Serialize for VariableCache
impl Serialize for VariableCache
impl StructuralPartialEq for VariableCache
Auto Trait Implementations§
impl Freeze for VariableCache
impl RefUnwindSafe for VariableCache
impl Send for VariableCache
impl Sync for VariableCache
impl Unpin for VariableCache
impl UnwindSafe for VariableCache
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.