fn backtrace()

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