问题描述
我正在编写一个操作系统,我希望我的操作系统能够生成良好的回溯,以便可以更好地调试紧急情况。我基于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 (将#修改为@)