繁体   English   中英

Rust Embedded panic 破坏堆栈

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM