From 17a8ccd388dc5908d99e9b25789939db495c95dc Mon Sep 17 00:00:00 2001 From: Addison Crump Date: Wed, 2 Aug 2023 12:56:23 +0200 Subject: [PATCH] address remaining notes --- aya/src/maps/stack_trace.rs | 17 ++++------------- aya/src/util.rs | 15 ++++++++++++--- xtask/public-api/aya.txt | 10 +++++----- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/aya/src/maps/stack_trace.rs b/aya/src/maps/stack_trace.rs index 55c96e21..7c3c7c94 100644 --- a/aya/src/maps/stack_trace.rs +++ b/aya/src/maps/stack_trace.rs @@ -1,7 +1,7 @@ //! A hash map of kernel or user space stack traces. //! //! See [`StackTraceMap`] for documentation and examples. -use std::{borrow::Borrow, collections::BTreeMap, fs, io, mem, path::Path, str::FromStr}; +use std::{borrow::Borrow, fs, io, mem, path::Path, str::FromStr}; use crate::{ maps::{IterableMap, MapData, MapError, MapIter, MapKeys}, @@ -159,19 +159,10 @@ impl<'a, T: Borrow> IntoIterator for &'a StackTraceMap { } } -/// A resolver for symbols based on an address obtained from a stacktrace. +/// A resolver for symbols based on an address obtained from a stack trace. pub trait SymbolResolver { /// Resolve a symbol for a given address, if possible. - fn resolve_sym(&self, addr: u64) -> Option; -} - -/// The simplest resolver: a direct map from addresses to strings. -pub type SimpleSymbolResolver = BTreeMap; - -impl SymbolResolver for SimpleSymbolResolver { - fn resolve_sym(&self, addr: u64) -> Option { - self.range(..=addr).next_back().map(|(_, s)| s.clone()) - } + fn resolve_sym(&self, addr: u64) -> Option<&str>; } /// A kernel or user space stack trace. @@ -191,7 +182,7 @@ impl StackTrace { /// them from debug info. pub fn resolve(&mut self, symbols: &R) -> &StackTrace { for frame in self.frames.iter_mut() { - frame.symbol_name = symbols.resolve_sym(frame.ip) + frame.symbol_name = symbols.resolve_sym(frame.ip).map(|s| s.to_string()) } self diff --git a/aya/src/util.rs b/aya/src/util.rs index b130c2b5..0c5a0857 100644 --- a/aya/src/util.rs +++ b/aya/src/util.rs @@ -14,8 +14,8 @@ use crate::{ Pod, }; -use crate::maps::stack_trace::SimpleSymbolResolver; use libc::{if_nametoindex, sysconf, uname, utsname, _SC_PAGESIZE}; +use crate::maps::stack_trace::SymbolResolver; /// Represents a kernel version, in major.minor.release version. // Adapted from https://docs.rs/procfs/latest/procfs/sys/kernel/struct.Version.html. @@ -202,6 +202,15 @@ fn parse_cpu_ranges(data: &str) -> Result, ()> { Ok(cpus) } +/// The simplest resolver: a direct map from addresses to strings. +pub type SimpleSymbolResolver = BTreeMap; + +impl SymbolResolver for SimpleSymbolResolver { + fn resolve_sym(&self, addr: u64) -> Option<&str> { + self.range(..=addr).next_back().map(|(_, s)| s.as_str()) + } +} + /// Loads kernel symbols from `/proc/kallsyms`. /// /// The symbols can be passed to [`StackTrace::resolve`](crate::maps::stack_trace::StackTrace::resolve). @@ -210,8 +219,8 @@ pub fn kernel_symbols() -> Result { parse_kernel_symbols(&mut reader) } -fn parse_kernel_symbols(reader: impl BufRead) -> Result, io::Error> { - let mut syms = BTreeMap::new(); +fn parse_kernel_symbols(reader: impl BufRead) -> Result { + let mut syms = SimpleSymbolResolver::new(); for line in reader.lines() { let line = line?; diff --git a/xtask/public-api/aya.txt b/xtask/public-api/aya.txt index f5ab0da8..9f39b46f 100644 --- a/xtask/public-api/aya.txt +++ b/xtask/public-api/aya.txt @@ -804,10 +804,9 @@ pub fn aya::maps::stack_trace::StackTraceMap::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya::maps::stack_trace::StackTraceMap pub fn aya::maps::stack_trace::StackTraceMap::from(t: T) -> T pub trait aya::maps::stack_trace::SymbolResolver -pub fn aya::maps::stack_trace::SymbolResolver::resolve_sym(&self, addr: u64) -> core::option::Option -impl aya::maps::stack_trace::SymbolResolver for aya::maps::stack_trace::SimpleSymbolResolver -pub fn aya::maps::stack_trace::SimpleSymbolResolver::resolve_sym(&self, addr: u64) -> core::option::Option -pub type aya::maps::stack_trace::SimpleSymbolResolver = alloc::collections::btree::map::BTreeMap +pub fn aya::maps::stack_trace::SymbolResolver::resolve_sym(&self, addr: u64) -> core::option::Option<&str> +impl aya::maps::stack_trace::SymbolResolver for aya::util::SimpleSymbolResolver +pub fn aya::util::SimpleSymbolResolver::resolve_sym(&self, addr: u64) -> core::option::Option<&str> pub enum aya::maps::Map pub aya::maps::Map::Array(aya::maps::MapData) pub aya::maps::Map::BloomFilter(aya::maps::MapData) @@ -6976,10 +6975,11 @@ impl core::borrow::BorrowMut for aya::util::KernelVersion where T: core::m pub fn aya::util::KernelVersion::borrow_mut(&mut self) -> &mut T impl core::convert::From for aya::util::KernelVersion pub fn aya::util::KernelVersion::from(t: T) -> T -pub fn aya::util::kernel_symbols() -> core::result::Result +pub fn aya::util::kernel_symbols() -> core::result::Result pub fn aya::util::nr_cpus() -> core::result::Result pub fn aya::util::online_cpus() -> core::result::Result, std::io::error::Error> pub fn aya::util::syscall_prefix() -> core::result::Result<&'static str, std::io::error::Error> +pub type aya::util::SimpleSymbolResolver = alloc::collections::btree::map::BTreeMap pub macro aya::include_bytes_aligned! pub enum aya::BpfError pub aya::BpfError::BtfError(aya_obj::btf::btf::BtfError)