当 Debugger 对你撒谎时
When the Debugger Lies

最近我在研究 Nordic Semiconductor 的 nRF54L 系列安全架构时,习惯性地跳过固件编写,直接用 Debugger 手动操作寄存器。在测试 Key Management Unit (KMU) 时,我遇到了一个诡异现象:内存中的值明明没有更新,但事件标志位却显示操作成功。经过深入排查,发现是 GDB 和 JLinkGDBServer 在读取内存时使用了不同的协议包,导致读取到了缓存中的陈旧数据,而直接通过 ReadMemAP 命令访问 AHB-AP 端口则能获取真实值。这个经历提醒我们,在涉及 Arm TrustZone 和底层硬件调试时,Debugger 看到的未必是真相,理解 SoC 内部组件与调试器的交互机制至关重要。
如果你向 KMU 的槽位中配置了不符合规范的数据,然后试图使用支持的驱动程序与之交互,那你绝对会过得非常糟糕。
HN 评论区
19- pletnes
这让我想起有一次 Visual Studio 显示某个变量的值,但 print 输出的却是另一个值。从那以后我再也不信任 VS 了。
- sharktheone
Debugger 经常撒谎。尤其是当你直接操作 ASM 的时候。我遇到过 V8 调试的问题,Debugger 坚称某个函数被调用了,但实际上肯定没有。就算开启了 V8 应该输出 gdb 信息的选项也还是这样 :/
- zavec
太酷了!我很喜欢读这类细节内容。