Skip to content

Commit bb82a47

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

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

src/frames.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ 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 where T: Fn(&str)->Cow<str> + 'static {
107111
demangle(&String::from_utf8_lossy(self.raw_name())).into_owned()
108112
}
109113

src/report.rs

Lines changed: 17 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,15 @@ impl<'a> ReportBuilder<'a> {
5763
self
5864
}
5965

66+
pub fn demangler<T, S>(&mut self, demangler: T) -> &mut Self
67+
where
68+
T: Fn(&str) -> Cow<str> + 'static,
69+
{
70+
self.demangle = Box::new(demangler);
71+
72+
self
73+
}
74+
6075
/// Build an `UnresolvedReport`
6176
pub fn build_unresolved(&self) -> Result<UnresolvedReport> {
6277
let mut hash_map = HashMap::new();
@@ -232,7 +247,7 @@ mod protobuf {
232247
dedup_str.insert(key.thread_name_or_id());
233248
for frame in key.frames.iter() {
234249
for symbol in frame {
235-
dedup_str.insert(symbol.name());
250+
dedup_str.insert(symbol.name_with_demangle(&self.demangle));
236251
dedup_str.insert(symbol.sys_name().into_owned());
237252
dedup_str.insert(symbol.filename().into_owned());
238253
}
@@ -260,7 +275,7 @@ mod protobuf {
260275
let mut locs = vec![];
261276
for frame in key.frames.iter() {
262277
for symbol in frame {
263-
let name = symbol.name();
278+
let name = symbol.name_with_demangle(&self.demangle);
264279
if let Some(loc_idx) = functions.get(&name) {
265280
locs.push(*loc_idx);
266281
continue;

0 commit comments

Comments
 (0)