Skip to content

Commit

Permalink
segment out resolver to a trait
Browse files Browse the repository at this point in the history
  • Loading branch information
addisoncrump committed Aug 1, 2023
1 parent 3692e53 commit 835fe7f
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 6 deletions.
25 changes: 20 additions & 5 deletions aya/src/maps/stack_trace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion aya/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)
}
Expand Down

0 comments on commit 835fe7f

Please sign in to comment.