segment out resolver to a trait

pull/715/head
Addison Crump 2 years ago
parent 3692e53ff0
commit 835fe7fa7b
No known key found for this signature in database
GPG Key ID: D495C2DF24C779B2

@ -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.
///
/// 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
/// user-space traces you need to provide the symbols, for example loading
/// 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() {
frame.symbol_name = symbols
.range(..=frame.ip)
.next_back()
.map(|(_, s)| s.clone())
frame.symbol_name = symbols.resolve_sym(frame.ip)
}
self

@ -15,6 +15,7 @@ use crate::{
};
use libc::{if_nametoindex, sysconf, uname, utsname, _SC_PAGESIZE};
use crate::maps::stack_trace::SimpleSymbolResolver;
/// Represents a kernel version, in major.minor.release version.
// Adapted from https://docs.rs/procfs/latest/procfs/sys/kernel/struct.Version.html.
@ -204,7 +205,7 @@ fn parse_cpu_ranges(data: &str) -> Result<Vec<u32>, ()> {
/// Loads kernel symbols from `/proc/kallsyms`.
///
/// The symbols can be passed to [`StackTrace::resolve`](crate::maps::stack_trace::StackTrace::resolve).
pub fn kernel_symbols() -> Result<BTreeMap<u64, String>, io::Error> {
pub fn kernel_symbols() -> Result<SimpleSymbolResolver, io::Error> {
let mut reader = BufReader::new(File::open("/proc/kallsyms")?);
parse_kernel_symbols(&mut reader)
}

Loading…
Cancel
Save