如何在 Arm CortexM 中调试 IACCESS 违规 memfault

问题描述

当 PC 值因任何原因损坏时,可能是 IACCESS 故障。怎样才能查出故障发生前正在执行的上一条指令(上一条指令的地址)是哪一条?因为,当故障被捕获时,PC 已经包含一些无效值。如何知道导致错误的代码位置?

解决方法

根据我的经验,PC 损坏是最难调试的“常见”故障,正是出于这个原因。

从长远来看,到目前为止最简单的方法是使用跟踪,但根据您使用的设备以及您的硬件和软件设置,这可能并不容易设置。这甚至是不可能的 - 并非所有设备都支持它,尽管我使用过的所有 Cortex-M 设备都支持(我认为)。跟踪将允许您在故障后转储最近的 PC 值。如果您在此平台上进行大量开发工作,我建议您将跟踪设置为一项值得的时间投资。

如果做不到这一点,通常你能做的最好的事情就是在堆栈上进行一些侦查。特别是,在进入处理程序模式时,LR 的值将被堆叠;这通常会告诉您上次呼叫 (BL) 是在哪里发出的,这可以为您提供线索。然后,您可以设置断点并尝试缩小范围。不过,这并不是万无一失的技术。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...