在rust中使用no_std回溯

问题描述

我正在编写一个操作系统,我希望我的操作系统能够生成良好的回溯,以便可以更好地调试紧急情况。我基于OSDev wiki编写了一些代码,但是rust使用了完全不同的ABI,因此该代码似乎无法正常工作。我的代码:

pub fn get_backtrace(mxf: u64) -> Vec<VirtAddr> {
    let mut ptr: *mut stackframe;
    unsafe {
        asm!(
            "mov {0},rbp",out(reg) ptr
        );
    }
    let mut v: Vec<VirtAddr> = vec![];
    for _i in 0..mxf {
        let cf = unsafe { ptr.as_ref().expect("Error backtracing") };
        println!("Frame: {:?}",cf);
        v.push(VirtAddr::from_ptr(cf.rip as *const ()));
        ptr = cf.rbp as *mut stackframe;
        if ptr as u64 == 0 {
            break;
        }
    }
    v
}

我还可以拆卸某些功能:

pwndbg> disassemble 'an_os::backtrace::addrof'
Dump of assembler code for function an_os::backtrace::addrof:
   0x0000000000229d80 <+0>:     sub    rsp,0x18
   0x0000000000229d84 <+4>:     mov    QWORD PTR [rsp+0x10],rdi
   0x0000000000229d89 <+9>:     call   0x221f90 <x86_64::addr::VirtAddr::from_ptr>
   0x0000000000229d8e <+14>:    mov    QWORD PTR [rsp+0x8],rax
   0x0000000000229d93 <+19>:    mov    rax,QWORD PTR [rsp+0x8]
   0x0000000000229d98 <+24>:    add    rsp,0x18
   0x0000000000229d9c <+28>:    ret    
End of assembler dump.
pwndbg> disassemble 'an_os::backtrace::mark'
Dump of assembler code for function an_os::backtrace::mark:
   0x000000000021b610 <+0>:     sub    rsp,0x38
   0x000000000021b614 <+4>:     mov    QWORD PTR [rsp+0x20],rdi
   0x000000000021b619 <+9>:     mov    QWORD PTR [rsp+0x28],rsi
   0x000000000021b61e <+14>:    mov    QWORD PTR [rsp+0x30],rdx
   0x000000000021b623 <+19>:    mov    QWORD PTR [rsp+0x18],rdx
   0x000000000021b628 <+24>:    mov    QWORD PTR [rsp+0x10],rsi
   0x000000000021b62d <+29>:    call   0x229d80 <an_os::backtrace::addrof>
   0x000000000021b632 <+34>:    mov    QWORD PTR [rsp+0x8],rax
   0x000000000021b637 <+39>:    mov    rdi,QWORD PTR [rsp+0x8]
   0x000000000021b63c <+44>:    mov    rsi,QWORD PTR [rsp+0x10]
   0x000000000021b641 <+49>:    mov    rdx,QWORD PTR [rsp+0x18]
   0x000000000021b646 <+54>:    call   0x21b110 <an_os::backtrace::markll>
   0x000000000021b64b <+59>:    add    rsp,0x38
   0x000000000021b64f <+63>:    ret    
End of assembler dump.

在这种情况下,如何编写堆栈跟踪打印机?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...