[英]Rust Embedded panic destroys stack
我在 Cortex-M4 上使用 Rust,并使用 gdb 和 openocd 来调试它。
在 C(++) 中,我习惯于在发生异常(如硬故障)时查看调用堆栈。 查看哪一行导致异常真的很有帮助。
然而,在 Rust 中,当发生 panic 时,调用栈几乎是空的。 为什么会发生这种情况?
有没有办法让 Rust 保留堆栈(仅用于调试器,我不需要打印它)? 或者我可以在调用堆栈尚未销毁的地方插入断点吗?
现在我在某个地方有一个令人恐慌的解包,但除非我单步执行大量代码,否则我找不到哪里。
编辑:这是我在恐慌处理程序中得到的堆栈跟踪:
i stack
#0 rust_begin_unwind (info=0x2001f810) at src\main.rs:122
#1 0x080219dc in cortex_m::itm::write_fmt (port=0x2001f820, args=...) at C:\Users\d.dokter\.cargo\registry\src\github.com-1ecc6299db9ec823\cortex-m-0.6.1\src/itm.rs:128
#2 0x2001f894 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
write_fmt 函数在堆栈上也很奇怪,因为它在处理程序中被调用以记录恐慌。 我发现 0x2001f894 地址也很可疑,因为这是一个 RAM 地址。
最简单的解决方案是将恐慌处理程序设置为调用abort()
而不是展开堆栈。 这可以通过将其添加到Cargo.toml
来完成
[profile.dev]
panic = "abort"
[profile.release]
panic = "abort"
使用此设置,恐慌处理程序将立即调用abort()
,因此 gdb 仍然可以看到整个回溯。
如果只想打印堆栈跟踪,还可以设置环境变量RUST_BACKTRACE=1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.