Skip to content

Commit 56e8054

Browse files
d-e-s-oanakryiko
authored andcommitted
deps: update blazesym submodule to v0.2.0-alpha.7
Update the blazesym submodule to version 0.2.0-alpha.7. Signed-off-by: Daniel Müller <deso@posteo.net>
1 parent b9b3680 commit 56e8054

File tree

4 files changed

+118
-71
lines changed

4 files changed

+118
-71
lines changed

examples/c/profile.c

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,33 @@ static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu
3434

3535
static struct blaze_symbolizer *symbolizer;
3636

37+
static void print_frame(const char *name, uintptr_t input_addr, uintptr_t addr, uint64_t offset, const blaze_symbolize_code_info* code_info)
38+
{
39+
// If we have an input address we have a new symbol.
40+
if (input_addr != 0) {
41+
printf("%016lx: %s @ 0x%lx+0x%lx", input_addr, name, addr, offset);
42+
if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL) {
43+
printf(" %s/%s:%u\n", code_info->dir, code_info->file, code_info->line);
44+
} else if (code_info != NULL && code_info->file != NULL) {
45+
printf(" %s:%u\n", code_info->file, code_info->line);
46+
} else {
47+
printf("\n");
48+
}
49+
} else {
50+
printf("%016s %s", "", name);
51+
if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL) {
52+
printf("@ %s/%s:%u [inlined]\n", code_info->dir, code_info->file, code_info->line);
53+
} else if (code_info != NULL && code_info->file != NULL) {
54+
printf("@ %s:%u [inlined]\n", code_info->file, code_info->line);
55+
} else {
56+
printf("[inlined]\n");
57+
}
58+
}
59+
}
60+
3761
static void show_stack_trace(__u64 *stack, int stack_sz, pid_t pid)
3862
{
63+
const struct blaze_symbolize_inlined_fn* inlined;
3964
const struct blaze_result *result;
4065
const struct blaze_sym *sym;
4166
int i, j;
@@ -54,39 +79,18 @@ static void show_stack_trace(__u64 *stack, int stack_sz, pid_t pid)
5479

5580

5681
for (i = 0; i < stack_sz; i++) {
57-
if (!result || result->size <= i || !result->entries[i].size) {
82+
if (!result || result->cnt <= i || result->syms[i].name == NULL) {
5883
printf(" %2d [<%016llx>]\n", i, stack[i]);
5984
continue;
6085
}
6186

62-
if (result->entries[i].size == 1) {
63-
sym = &result->entries[i].syms[0];
64-
65-
if (sym->dir && sym->dir[0] != '\0' && sym->file && sym->file[0] != '\0') {
66-
printf(" %2d [<%016llx>] %s+0x%lx %s/%s:%u\n", i, stack[i],
67-
sym->name, sym->offset, sym->dir, sym->file, sym->line);
68-
} else if (sym->file && sym->file[0] != '\0') {
69-
printf(" %2d [<%016llx>] %s+0x%lx %s:%u\n", i, stack[i],
70-
sym->name, sym->offset, sym->file, sym->line);
71-
} else {
72-
printf(" %2d [<%016llx>] %s+0x%lx\n", i, stack[i], sym->name, sym->offset);
73-
}
74-
continue;
75-
}
87+
sym = &result->syms[i];
88+
print_frame(sym->name, stack[i], sym->addr, sym->offset, &sym->code_info);
7689

77-
printf(" %2d [<%016llx>]\n", i, stack[i]);
78-
for (j = 0; j < result->entries[i].size; j++) {
79-
sym = &result->entries[i].syms[j];
80-
if (sym->dir && sym->dir[0] != '\0' && sym->file && sym->file[0] != '\0') {
81-
printf(" %s+0x%lx %s/%s:%u\n", sym->name,
82-
sym->offset, sym->dir, sym->file, sym->line);
83-
} else if (sym->file && sym->file[0] != '\0') {
84-
printf(" %s+0x%lx %s:%u\n", sym->name,
85-
sym->offset, sym->file, sym->line);
86-
} else {
87-
printf(" %s+0x%lx\n", sym->name, sym->offset);
88-
}
89-
}
90+
for (j = 0; j < sym->inlined_cnt; j++) {
91+
inlined = &sym->inlined[j];
92+
print_frame(sym->name, 0, 0, 0, &inlined->code_info);
93+
}
9094
}
9195

9296
blaze_result_free(result);

examples/rust/Cargo.lock

Lines changed: 35 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/rust/profile/src/main.rs

Lines changed: 50 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::io::Error;
22
use std::mem;
3-
use std::path::PathBuf;
43
use std::time::Duration;
54

65
use blazesym::symbolize;
@@ -24,6 +23,7 @@ use profile::*;
2423

2524
const MAX_STACK_DEPTH: usize = 128;
2625
const TASK_COMM_LEN: usize = 16;
26+
const ADDR_WIDTH: usize = 16;
2727

2828
// A Rust version of stacktrace_event in profile.h
2929
#[repr(C)]
@@ -69,6 +69,39 @@ fn attach_perf_event(
6969
.collect()
7070
}
7171

72+
fn print_frame(name: &str, addr_info: Option<(blazesym::Addr, blazesym::Addr, usize)>, code_info: &Option<symbolize::CodeInfo>) {
73+
let code_info = code_info.as_ref().map(|code_info| {
74+
let path = code_info.to_path();
75+
let path = path.display();
76+
77+
match (code_info.line, code_info.column) {
78+
(Some(line), Some(col)) => format!(" {path}:{line}:{col}"),
79+
(Some(line), None) => format!(" {path}:{line}"),
80+
(None, _) => format!(" {path}"),
81+
}
82+
});
83+
84+
if let Some((input_addr, addr, offset)) = addr_info {
85+
// If we have various address information bits we have a new symbol.
86+
println!(
87+
"{input_addr:#0width$x}: {name} @ {addr:#x}+{offset:#x}{code_info}",
88+
code_info = code_info.as_deref().unwrap_or(""),
89+
width = ADDR_WIDTH
90+
)
91+
} else {
92+
// Otherwise we are dealing with an inlined call.
93+
println!(
94+
"{:width$} {name}{code_info} [inlined]",
95+
" ",
96+
code_info = code_info
97+
.map(|info| format!(" @{info}"))
98+
.as_deref()
99+
.unwrap_or(""),
100+
width = ADDR_WIDTH
101+
)
102+
}
103+
}
104+
72105
// Pid 0 means a kernel space stack.
73106
fn show_stack_trace(stack: &[u64], symbolizer: &symbolize::Symbolizer, pid: u32) {
74107
let converted_stack;
@@ -101,36 +134,23 @@ fn show_stack_trace(stack: &[u64], symbolizer: &symbolize::Symbolizer, pid: u32)
101134
}
102135
};
103136

104-
for (i, (addr, syms)) in stack.iter().zip(syms).enumerate() {
105-
let mut addr_fmt = format!(" {i:2} [<{addr:016x}>]");
106-
if syms.is_empty() {
107-
println!("{addr_fmt}")
108-
} else {
109-
for (i, sym) in syms.into_iter().enumerate() {
110-
if i == 1 {
111-
addr_fmt = addr_fmt.replace(|_c| true, " ");
137+
for (input_addr, sym) in stack.iter().copied().zip(syms) {
138+
match sym {
139+
symbolize::Symbolized::Sym(symbolize::Sym {
140+
name,
141+
addr,
142+
offset,
143+
code_info,
144+
inlined,
145+
..
146+
}) => {
147+
print_frame(&name, Some((input_addr, addr, offset)), &code_info);
148+
for frame in inlined.iter() {
149+
print_frame(&frame.name, None, &frame.code_info);
112150
}
113-
114-
let path = match (sym.dir, sym.file) {
115-
(Some(dir), Some(file)) => Some(dir.join(file)),
116-
(dir, file) => dir.or_else(|| file.map(PathBuf::from)),
117-
};
118-
119-
let src_loc = if let (Some(path), Some(line)) = (path, sym.line) {
120-
if let Some(col) = sym.column {
121-
format!(" {}:{line}:{col}", path.display())
122-
} else {
123-
format!(" {}:{line}", path.display())
124-
}
125-
} else {
126-
String::new()
127-
};
128-
129-
let symbolize::Sym {
130-
name, addr, offset, ..
131-
} = sym;
132-
133-
println!("{addr_fmt} {name} @ {addr:#x}+{offset:#x}{src_loc}");
151+
}
152+
symbolize::Symbolized::Unknown => {
153+
println!("{input_addr:#0width$x}: <no-symbol>", width = ADDR_WIDTH)
134154
}
135155
}
136156
}

0 commit comments

Comments
 (0)