|
|
@ -159,6 +159,24 @@ impl<'a, T: Borrow<MapData>> IntoIterator for &'a StackTraceMap<T> {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// A resolver for symbols based on an address obtained from a stacktrace.
|
|
|
|
|
|
|
|
pub trait SymbolResolver {
|
|
|
|
|
|
|
|
/// Resolve a symbol for a given address, if possible.
|
|
|
|
|
|
|
|
fn resolve_sym(&self, addr: u64) -> Option<String>;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// The simplest resolver: a direct map from addresses to strings.
|
|
|
|
|
|
|
|
pub type SimpleSymbolResolver = BTreeMap<u64, String>;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl SymbolResolver for SimpleSymbolResolver {
|
|
|
|
|
|
|
|
fn resolve_sym(&self, addr: u64) -> Option<String> {
|
|
|
|
|
|
|
|
self
|
|
|
|
|
|
|
|
.range(..=addr)
|
|
|
|
|
|
|
|
.next_back()
|
|
|
|
|
|
|
|
.map(|(_, s)| s.clone())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// A kernel or user space stack trace.
|
|
|
|
/// A kernel or user space stack trace.
|
|
|
|
///
|
|
|
|
///
|
|
|
|
/// See the [`StackTraceMap`] documentation for examples.
|
|
|
|
/// See the [`StackTraceMap`] documentation for examples.
|
|
|
@ -174,12 +192,9 @@ impl StackTrace {
|
|
|
|
/// You can use [`util::kernel_symbols()`](crate::util::kernel_symbols) to load kernel symbols. For
|
|
|
|
/// You can use [`util::kernel_symbols()`](crate::util::kernel_symbols) to load kernel symbols. For
|
|
|
|
/// user-space traces you need to provide the symbols, for example loading
|
|
|
|
/// user-space traces you need to provide the symbols, for example loading
|
|
|
|
/// them from debug info.
|
|
|
|
/// them from debug info.
|
|
|
|
pub fn resolve(&mut self, symbols: &BTreeMap<u64, String>) -> &StackTrace {
|
|
|
|
pub fn resolve<R: SymbolResolver>(&mut self, symbols: &R) -> &StackTrace {
|
|
|
|
for frame in self.frames.iter_mut() {
|
|
|
|
for frame in self.frames.iter_mut() {
|
|
|
|
frame.symbol_name = symbols
|
|
|
|
frame.symbol_name = symbols.resolve_sym(frame.ip)
|
|
|
|
.range(..=frame.ip)
|
|
|
|
|
|
|
|
.next_back()
|
|
|
|
|
|
|
|
.map(|(_, s)| s.clone())
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
self
|
|
|
|
self
|
|
|
|