rust - 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 地址。
解决方案
最简单的解决方案是将恐慌处理程序设置为调用abort()
而不是展开堆栈。这可以通过将其添加到您的Cargo.toml
[profile.dev]
panic = "abort"
[profile.release]
panic = "abort"
有了这个设置,恐慌处理程序将立即调用abort()
,所以 gdb 仍然可以看到整个回溯。
如果只想打印堆栈跟踪,也可以设置环境变量RUST_BACKTRACE=1
。
推荐阅读
- java - 按字母顺序将节点插入双向链表时出现问题
- reactjs - 为每个类型更改执行去抖动输入更改
- html - 为什么导航栏不显示时可以单击 li?
- asp.net-core - 如何将 Akka.Net 流与 AspNet 核心或长颈鹿集成
- scala - Spark Scala 根据自联接数据框查询的结果输入空值
- gremlin - Gremlin:OLAP 与划分查询
- javascript - styled-components 使输入范围不起作用
- python - 获取字典中每个列表中 2 个位置值的乘积之和
- java - 从数组切换到数组列表
- python - Flask-SQLAlchemy 绑定多个数据库 -> (psycopg2.OperationalError) 致命:数据库“customer1”不存在