Skip to content

Commit 8b27df5

Browse files
authored
app: introduced format_symbolize (#20)
Signed-off-by: Xiaobo Liu <[email protected]>
1 parent 0e31e1d commit 8b27df5

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

rust-memleak/src/main.rs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use aya::maps::{HashMap as EbpfHashMap, StackTraceMap};
1010
use aya::programs::UProbe;
1111
use aya::util::kernel_symbols;
1212
use aya::{Btf, Ebpf, EbpfLoader};
13-
use blazesym::symbolize::{Input, Process, Source, Symbolizer};
13+
use blazesym::symbolize::{CodeInfo, Input, Process, Source, Sym, Symbolizer};
1414
use blazesym::Pid;
1515
use clap::Parser;
1616
use libc::pid_t;
@@ -178,7 +178,7 @@ fn symbolize_stack_frames(
178178
}
179179

180180
let name = match sym.as_sym() {
181-
Some(x) => format!("{}+0x{:x}", x.name, x.offset),
181+
Some(x) => format_symbolize(x),
182182
None => {
183183
ksymbols_search(ksyms, *addr).unwrap_or_else(|| format!("unknown_0x{:08x}", addr))
184184
}
@@ -190,6 +190,44 @@ fn symbolize_stack_frames(
190190
Ok(buffer)
191191
}
192192

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+
193231
fn ksymbols_search(ksyms: &BTreeMap<u64, String>, ip: u64) -> Option<String> {
194232
let (sym_addr, name) = ksyms.range(..=ip).next_back()?;
195233

0 commit comments

Comments
 (0)