我正在尝试调试一个部分使用缓存数据内存和缓存指令内存的程序。问题在于调试器在尝试检查这样的内存时如何工作。它在检查特定位置时是否访问缓存副本?如果是这样,它是否真的修改了缓存,因为一旦丢失就必须获取数据?这是否意味着在调试器下的程序行为可能与没有它的程序行为不同?有什么方法可以调试与缓存相关的问题,而无需调试器影响缓存?
更新:具体的 CPU 内核是 ARM Cortex-A5。调试器是 DSTREAM/DS-5
问问题
718 次
2 回答
3
我认为这个问题有点笼统,因为它取决于 CPU。
然而,一些非常全球性的规则:
- 调试器将尝试查看 CPU 在数据访问中看到的内容,其中包括对数据缓存的缓存查找。
- 这对于指令缓存是不同的,因为调试器通常不会进行查找,因为它会执行数据访问。但这通常不是问题,因为指令缓存不包含脏数据。根据调试器的不同,如果写入数据,它可以清除 DCache 并使相应的 ICache 行无效。
- 调试访问将尽量不具有侵入性,并且可以强制采用在未命中的情况下不执行换行的模式。但这实际上取决于 CPU,而不是全局规则。
于 2016-04-22T19:57:23.007 回答
2
DS-5使用连接到 CPU 的 JTAG 探头。要读取 CPU 的可寻址内存,它必须通过其微操作运行 CPU 以获取内存。与 CPU 只是运行程序不同,这会扰乱缓存。
您可以通过在关键(可疑)代码之后才停止 CPU 来最小化影响,然后尝试从寄存器和内存的内容中拼凑出必须发生的事情。如果您可以从开始到断点运行程序,特别是如果那是 10,000+ 条指令,那么缓存可能会进入正确的状态。除非有异步活动。
要确定问题是否是由于缓存引起的,也许您可以简单地禁用缓存?
于 2016-04-22T20:27:37.633 回答