53 lines
1.2 KiB
Rust
53 lines
1.2 KiB
Rust
|
fn main() {
|
||
|
foo();
|
||
|
}
|
||
|
|
||
|
fn foo() {
|
||
|
bar()
|
||
|
}
|
||
|
fn bar() {
|
||
|
baz()
|
||
|
}
|
||
|
fn baz() {
|
||
|
print()
|
||
|
}
|
||
|
|
||
|
#[cfg(target_pointer_width = "32")]
|
||
|
const HEX_WIDTH: usize = 10;
|
||
|
#[cfg(target_pointer_width = "64")]
|
||
|
const HEX_WIDTH: usize = 20;
|
||
|
|
||
|
fn print() {
|
||
|
let mut cnt = 0;
|
||
|
backtrace::trace(|frame| {
|
||
|
let ip = frame.ip();
|
||
|
print!("frame #{:<2} - {:#02$x}", cnt, ip as usize, HEX_WIDTH);
|
||
|
cnt += 1;
|
||
|
|
||
|
let mut resolved = false;
|
||
|
backtrace::resolve(frame.ip(), |symbol| {
|
||
|
if !resolved {
|
||
|
resolved = true;
|
||
|
} else {
|
||
|
print!("{}", vec![" "; 7 + 2 + 3 + HEX_WIDTH].join(""));
|
||
|
}
|
||
|
|
||
|
if let Some(name) = symbol.name() {
|
||
|
print!(" - {}", name);
|
||
|
} else {
|
||
|
print!(" - <unknown>");
|
||
|
}
|
||
|
if let Some(file) = symbol.filename() {
|
||
|
if let Some(l) = symbol.lineno() {
|
||
|
print!("\n{:13}{:4$}@ {}:{}", "", "", file.display(), l, HEX_WIDTH);
|
||
|
}
|
||
|
}
|
||
|
println!("");
|
||
|
});
|
||
|
if !resolved {
|
||
|
println!(" - <no info>");
|
||
|
}
|
||
|
true // keep going
|
||
|
});
|
||
|
}
|