Skip to content

Commit e546275

Browse files
committed
add custom demangler
Signed-off-by: YangKeao <[email protected]>
1 parent 63d3ff6 commit e546275

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ backtrace = { version = "0.3", optional = true }
2828
once_cell = "1.9"
2929
libc = "^0.2.66"
3030
log = "0.4"
31-
nix = { version = "0.24", default-features = false, features = ["signal"] }
31+
nix = { version = "0.24", default-features = false, features = ["signal", "fs"] }
3232
parking_lot = "0.12"
3333
tempfile = "3.1"
3434
thiserror = "1.0"

src/frames.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ impl Symbol {
104104
}
105105

106106
pub fn name(&self) -> String {
107+
self.name_with_demangle(demangle)
108+
}
109+
110+
pub fn name_with_demangle<T>(&self, demangle: T) -> String
111+
where
112+
T: Fn(&str) -> Cow<str> + 'static,
113+
{
107114
demangle(&String::from_utf8_lossy(self.raw_name())).into_owned()
108115
}
109116

src/report.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.
22

3+
use std::borrow::Cow;
34
use std::collections::HashMap;
45
use std::fmt::{Debug, Formatter};
56

67
use parking_lot::RwLock;
8+
use symbolic_demangle::demangle;
79

810
use crate::frames::{Frames, UnresolvedFrames};
911
use crate::profiler::Profiler;
@@ -32,6 +34,8 @@ pub struct UnresolvedReport {
3234
/// A builder of `Report` and `UnresolvedReport`. It builds report from a running `Profiler`.
3335
pub struct ReportBuilder<'a> {
3436
frames_post_processor: Option<Box<dyn Fn(&mut Frames)>>,
37+
demangle: Box<dyn Fn(&str) -> Cow<str>>,
38+
3539
profiler: &'a RwLock<Result<Profiler>>,
3640
timing: ReportTiming,
3741
}
@@ -40,6 +44,8 @@ impl<'a> ReportBuilder<'a> {
4044
pub(crate) fn new(profiler: &'a RwLock<Result<Profiler>>, timing: ReportTiming) -> Self {
4145
Self {
4246
frames_post_processor: None,
47+
demangle: Box::new(demangle),
48+
4349
profiler,
4450
timing,
4551
}
@@ -57,6 +63,29 @@ impl<'a> ReportBuilder<'a> {
5763
self
5864
}
5965

66+
/// Set `demangle` of a `ReportBuilder`. Before finally building a report,
67+
/// `demangle` will be applied to every symbol.
68+
/// # Examples
69+
///
70+
/// ```
71+
/// # use std::borrow::Cow;
72+
/// fn demangle(symbol:&str) -> Cow<'_, str> {
73+
/// println!("demangling {}", symbol);
74+
/// Cow::from(symbol)
75+
/// };
76+
///
77+
/// let guard = pprof::ProfilerGuard::new(100).unwrap();
78+
/// guard.report().demangle(demangle).build().unwrap();
79+
/// ```
80+
pub fn demangle<T>(&mut self, demangle: T) -> &mut Self
81+
where
82+
T: Fn(&str) -> Cow<str> + 'static,
83+
{
84+
self.demangle = Box::new(demangle);
85+
86+
self
87+
}
88+
6089
/// Build an `UnresolvedReport`
6190
pub fn build_unresolved(&self) -> Result<UnresolvedReport> {
6291
let mut hash_map = HashMap::new();
@@ -232,7 +261,7 @@ mod protobuf {
232261
dedup_str.insert(key.thread_name_or_id());
233262
for frame in key.frames.iter() {
234263
for symbol in frame {
235-
dedup_str.insert(symbol.name());
264+
dedup_str.insert(symbol.name_with_demangle(&self.demangle));
236265
dedup_str.insert(symbol.sys_name().into_owned());
237266
dedup_str.insert(symbol.filename().into_owned());
238267
}
@@ -260,7 +289,7 @@ mod protobuf {
260289
let mut locs = vec![];
261290
for frame in key.frames.iter() {
262291
for symbol in frame {
263-
let name = symbol.name();
292+
let name = symbol.name_with_demangle(&self.demangle);
264293
if let Some(loc_idx) = functions.get(&name) {
265294
locs.push(*loc_idx);
266295
continue;

0 commit comments

Comments
 (0)