当 Debugger 对你撒谎时

When the Debugger Lies

当 Debugger 对你撒谎时

最近我在研究 Nordic Semiconductor 的 nRF54L 系列安全架构时,习惯性地跳过固件编写,直接用 Debugger 手动操作寄存器。在测试 Key Management Unit (KMU) 时,我遇到了一个诡异现象:内存中的值明明没有更新,但事件标志位却显示操作成功。经过深入排查,发现是 GDB 和 JLinkGDBServer 在读取内存时使用了不同的协议包,导致读取到了缓存中的陈旧数据,而直接通过 ReadMemAP 命令访问 AHB-AP 端口则能获取真实值。这个经历提醒我们,在涉及 Arm TrustZone 和底层硬件调试时,Debugger 看到的未必是真相,理解 SoC 内部组件与调试器的交互机制至关重要。

如果你向 KMU 的槽位中配置了不符合规范的数据,然后试图使用支持的驱动程序与之交互,那你绝对会过得非常糟糕。
  1. pletnes

    这让我想起有一次 Visual Studio 显示某个变量的值,但 print 输出的却是另一个值。从那以后我再也不信任 VS 了。

  2. sharktheone

    Debugger 经常撒谎。尤其是当你直接操作 ASM 的时候。我遇到过 V8 调试的问题,Debugger 坚称某个函数被调用了,但实际上肯定没有。就算开启了 V8 应该输出 gdb 信息的选项也还是这样 :/

  3. zavec

    太酷了!我很喜欢读这类细节内容。

同日更多故事

2026-09-24