in reverie-ptrace/src/task.rs [2067:2107]
fn backtrace(&mut self) -> Option<Backtrace> {
use unwind::{Accessors, AddressSpace, Byteorder, Cursor, PTraceState, RegNum};
let mut frames = Vec::new();
let space = AddressSpace::new(Accessors::ptrace(), Byteorder::DEFAULT).ok()?;
let state = PTraceState::new(self.tid.as_raw() as u32).ok()?;
let mut cursor = Cursor::remote(&space, &state).ok()?;
loop {
let ip = cursor.register(RegNum::IP).ok()?;
let is_signal = cursor.is_signal_frame().ok()?;
// Try to resolve the symbol.
let mut symbol = None;
if let Ok(name) = cursor.procedure_name() {
if let Ok(info) = cursor.procedure_info() {
if info.start_ip() + name.offset() == ip {
symbol = Some(Symbol {
name: name.name().to_string(),
offset: name.offset(),
address: info.start_ip(),
size: info.end_ip() - info.start_ip(),
});
}
}
}
frames.push(Frame {
ip,
is_signal,
symbol,
});
if !cursor.step().ok()? {
break;
}
}
Some(Backtrace::new(self.tid(), frames))
}