首页 > 解决方案 > Rust Embedded 恐慌破坏堆栈

问题描述

我在 Cortex-M4 上使用 Rust 并使用带有 openocd 的 gdb 来调试它。

从 C(++) 开始,我习惯于在发生异常(如硬故障)时查看调用堆栈。查看哪条线导致异常非常有帮助。

然而,在 Rust 中,当发生恐慌时,调用堆栈几乎是空的。为什么会这样?

有没有办法让 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 地址。

标签: rustgdbembeddedpanic

解决方案


最简单的解决方案是将恐慌处理程序设置为调用abort()而不是展开堆栈。这可以通过将其添加到您的Cargo.toml

[profile.dev]
panic = "abort"

[profile.release]
panic = "abort"

有了这个设置,恐慌处理程序将立即调用abort(),所以 gdb 仍然可以看到整个回溯。

如果只想打印堆栈跟踪,也可以设置环境变量RUST_BACKTRACE=1


推荐阅读