Skip to content

Commit

Permalink
add custom demangler
Browse files Browse the repository at this point in the history
Signed-off-by: YangKeao <[email protected]>
  • Loading branch information
YangKeao committed May 9, 2022
1 parent 63d3ff6 commit e546275
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 3 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ backtrace = { version = "0.3", optional = true }
once_cell = "1.9"
libc = "^0.2.66"
log = "0.4"
nix = { version = "0.24", default-features = false, features = ["signal"] }
nix = { version = "0.24", default-features = false, features = ["signal", "fs"] }
parking_lot = "0.12"
tempfile = "3.1"
thiserror = "1.0"
Expand Down
7 changes: 7 additions & 0 deletions src/frames.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,13 @@ impl Symbol {
}

pub fn name(&self) -> String {
self.name_with_demangle(demangle)
}

pub fn name_with_demangle<T>(&self, demangle: T) -> String
where
T: Fn(&str) -> Cow<str> + 'static,
{
demangle(&String::from_utf8_lossy(self.raw_name())).into_owned()
}

Expand Down
33 changes: 31 additions & 2 deletions src/report.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.

use std::borrow::Cow;
use std::collections::HashMap;
use std::fmt::{Debug, Formatter};

use parking_lot::RwLock;
use symbolic_demangle::demangle;

use crate::frames::{Frames, UnresolvedFrames};
use crate::profiler::Profiler;
Expand Down Expand Up @@ -32,6 +34,8 @@ pub struct UnresolvedReport {
/// A builder of `Report` and `UnresolvedReport`. It builds report from a running `Profiler`.
pub struct ReportBuilder<'a> {
frames_post_processor: Option<Box<dyn Fn(&mut Frames)>>,
demangle: Box<dyn Fn(&str) -> Cow<str>>,

profiler: &'a RwLock<Result<Profiler>>,
timing: ReportTiming,
}
Expand All @@ -40,6 +44,8 @@ impl<'a> ReportBuilder<'a> {
pub(crate) fn new(profiler: &'a RwLock<Result<Profiler>>, timing: ReportTiming) -> Self {
Self {
frames_post_processor: None,
demangle: Box::new(demangle),

profiler,
timing,
}
Expand All @@ -57,6 +63,29 @@ impl<'a> ReportBuilder<'a> {
self
}

/// Set `demangle` of a `ReportBuilder`. Before finally building a report,
/// `demangle` will be applied to every symbol.
/// # Examples
///
/// ```
/// # use std::borrow::Cow;
/// fn demangle(symbol:&str) -> Cow<'_, str> {
/// println!("demangling {}", symbol);
/// Cow::from(symbol)
/// };
///
/// let guard = pprof::ProfilerGuard::new(100).unwrap();
/// guard.report().demangle(demangle).build().unwrap();
/// ```
pub fn demangle<T>(&mut self, demangle: T) -> &mut Self
where
T: Fn(&str) -> Cow<str> + 'static,
{
self.demangle = Box::new(demangle);

self
}

/// Build an `UnresolvedReport`
pub fn build_unresolved(&self) -> Result<UnresolvedReport> {
let mut hash_map = HashMap::new();
Expand Down Expand Up @@ -232,7 +261,7 @@ mod protobuf {
dedup_str.insert(key.thread_name_or_id());
for frame in key.frames.iter() {
for symbol in frame {
dedup_str.insert(symbol.name());
dedup_str.insert(symbol.name_with_demangle(&self.demangle));
dedup_str.insert(symbol.sys_name().into_owned());
dedup_str.insert(symbol.filename().into_owned());
}
Expand Down Expand Up @@ -260,7 +289,7 @@ mod protobuf {
let mut locs = vec![];
for frame in key.frames.iter() {
for symbol in frame {
let name = symbol.name();
let name = symbol.name_with_demangle(&self.demangle);
if let Some(loc_idx) = functions.get(&name) {
locs.push(*loc_idx);
continue;
Expand Down

0 comments on commit e546275

Please sign in to comment.