pretty_backtrace/
backtrace.rs

1use findshlibs::Avma;
2
3use crate::{Address, FrameIndex};
4
5pub fn print_backtrace() {
6    let context = crate::locate_debuginfo::get_context();
7
8    let backtrace = backtrace::Backtrace::new_unresolved();
9    for (i, stack_frame) in backtrace.frames().iter().enumerate().map(|(i, frame)| (FrameIndex(i), frame)) {
10        let addr = if let Some(addr) = Address::from_avma(Avma(stack_frame.ip() as *const u8)) {
11            addr
12        } else {
13            if stack_frame.ip() as usize == 0 {
14                eprintln!("{} \x1b[2m<end of stack> (0)\x1b[0m", i);
15            } else {
16                eprintln!("{} \x1b[91m<could not get svma> ({:016p})\x1b[0m", i, stack_frame.ip());
17            }
18
19            continue;
20        };
21
22        crate::display_frame::display_frame(&context, i, addr);
23    }
24}