1
1
// Copyright 2019 TiKV Project Authors. Licensed under Apache-2.0.
2
2
3
+ use std:: borrow:: Cow ;
3
4
use std:: collections:: HashMap ;
4
5
use std:: fmt:: { Debug , Formatter } ;
5
6
6
7
use parking_lot:: RwLock ;
8
+ use symbolic_demangle:: demangle;
7
9
8
10
use crate :: frames:: { Frames , UnresolvedFrames } ;
9
11
use crate :: profiler:: Profiler ;
@@ -32,6 +34,8 @@ pub struct UnresolvedReport {
32
34
/// A builder of `Report` and `UnresolvedReport`. It builds report from a running `Profiler`.
33
35
pub struct ReportBuilder < ' a > {
34
36
frames_post_processor : Option < Box < dyn Fn ( & mut Frames ) > > ,
37
+ demangle : Box < dyn Fn ( & str ) -> Cow < str > > ,
38
+
35
39
profiler : & ' a RwLock < Result < Profiler > > ,
36
40
timing : ReportTiming ,
37
41
}
@@ -40,6 +44,8 @@ impl<'a> ReportBuilder<'a> {
40
44
pub ( crate ) fn new ( profiler : & ' a RwLock < Result < Profiler > > , timing : ReportTiming ) -> Self {
41
45
Self {
42
46
frames_post_processor : None ,
47
+ demangle : Box :: new ( demangle) ,
48
+
43
49
profiler,
44
50
timing,
45
51
}
@@ -57,6 +63,29 @@ impl<'a> ReportBuilder<'a> {
57
63
self
58
64
}
59
65
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
+
60
89
/// Build an `UnresolvedReport`
61
90
pub fn build_unresolved ( & self ) -> Result < UnresolvedReport > {
62
91
let mut hash_map = HashMap :: new ( ) ;
@@ -232,7 +261,7 @@ mod protobuf {
232
261
dedup_str. insert ( key. thread_name_or_id ( ) ) ;
233
262
for frame in key. frames . iter ( ) {
234
263
for symbol in frame {
235
- dedup_str. insert ( symbol. name ( ) ) ;
264
+ dedup_str. insert ( symbol. name_with_demangle ( & self . demangle ) ) ;
236
265
dedup_str. insert ( symbol. sys_name ( ) . into_owned ( ) ) ;
237
266
dedup_str. insert ( symbol. filename ( ) . into_owned ( ) ) ;
238
267
}
@@ -260,7 +289,7 @@ mod protobuf {
260
289
let mut locs = vec ! [ ] ;
261
290
for frame in key. frames . iter ( ) {
262
291
for symbol in frame {
263
- let name = symbol. name ( ) ;
292
+ let name = symbol. name_with_demangle ( & self . demangle ) ;
264
293
if let Some ( loc_idx) = functions. get ( & name) {
265
294
locs. push ( * loc_idx) ;
266
295
continue ;
0 commit comments