@@ -10,7 +10,7 @@ use aya::maps::{HashMap as EbpfHashMap, StackTraceMap};
10
10
use aya:: programs:: UProbe ;
11
11
use aya:: util:: kernel_symbols;
12
12
use aya:: { Btf , Ebpf , EbpfLoader } ;
13
- use blazesym:: symbolize:: { Input , Process , Source , Symbolizer } ;
13
+ use blazesym:: symbolize:: { CodeInfo , Input , Process , Source , Sym , Symbolizer } ;
14
14
use blazesym:: Pid ;
15
15
use clap:: Parser ;
16
16
use libc:: pid_t;
@@ -178,7 +178,7 @@ fn symbolize_stack_frames(
178
178
}
179
179
180
180
let name = match sym. as_sym ( ) {
181
- Some ( x) => format ! ( "{}+0x{:x}" , x . name , x . offset ) ,
181
+ Some ( x) => format_symbolize ( x ) ,
182
182
None => {
183
183
ksymbols_search ( ksyms, * addr) . unwrap_or_else ( || format ! ( "unknown_0x{:08x}" , addr) )
184
184
}
@@ -190,6 +190,44 @@ fn symbolize_stack_frames(
190
190
Ok ( buffer)
191
191
}
192
192
193
+ fn format_symbolize ( sym : & Sym < ' _ > ) -> String {
194
+ let mut s = sym. name . to_string ( ) ;
195
+
196
+ if let Some ( code_info) = & sym. code_info {
197
+ s += format ! ( " ({})" , format_code_info( & code_info) ) . as_ref ( ) ;
198
+ } else {
199
+ if sym. inlined . len ( ) > 0 {
200
+ let inlined = & sym. inlined [ 0 ] ;
201
+
202
+ s += format ! ( " <inlined:{}>" , inlined. name) . as_ref ( ) ;
203
+
204
+ if let Some ( code_info) = & inlined. code_info {
205
+ s += format ! ( " ({})" , format_code_info( & code_info) ) . as_ref ( ) ;
206
+ }
207
+ }
208
+ }
209
+
210
+ s += format ! ( " +0x{:x}" , sym. offset) . as_ref ( ) ;
211
+
212
+ s
213
+ }
214
+
215
+ fn format_code_info ( code_info : & CodeInfo < ' _ > ) -> String {
216
+ match ( code_info. dir . as_ref ( ) , code_info. line ) {
217
+ ( Some ( dir) , Some ( line) ) => {
218
+ format ! (
219
+ "{}/{}:{}" ,
220
+ dir. display( ) ,
221
+ code_info. file. to_string_lossy( ) ,
222
+ line
223
+ )
224
+ }
225
+ ( Some ( dir) , None ) => format ! ( "{}/{}" , dir. display( ) , code_info. file. to_string_lossy( ) ) ,
226
+ ( None , Some ( line) ) => format ! ( "{}:{}" , code_info. file. to_string_lossy( ) , line) ,
227
+ ( None , None ) => format ! ( "{}" , code_info. file. to_string_lossy( ) ) ,
228
+ }
229
+ }
230
+
193
231
fn ksymbols_search ( ksyms : & BTreeMap < u64 , String > , ip : u64 ) -> Option < String > {
194
232
let ( sym_addr, name) = ksyms. range ( ..=ip) . next_back ( ) ?;
195
233
0 commit comments