An interface to libunwind.
libunwind provides access to the call chain of a process. It supports both local and remote processes.
Examples
Printing a backtrace of the current thread:
use unwind::{Cursor, RegNum};
Cursor::local(|mut cursor| {
loop {
let ip = cursor.register(RegNum::IP)?;
match (cursor.procedure_info(), cursor.procedure_name()) {
(Ok(ref info), Ok(ref name)) if ip == info.start_ip() + name.offset() => {
println!(
"{:#016x} - {} ({:#016x}) + {:#x}",
ip,
name.name(),
info.start_ip(),
name.offset()
);
}
_ => println!("{:#016x} - ????", ip),
}
if !cursor.step()? {
break;
}
}
Ok(())
}).unwrap();