| 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 | |
| }); | |
| } |