有没有办法记录给定程序的每次内存访问,包括时间戳。可以使用 perf
来做到这一点吗?
最佳答案
如果您使用的是英特尔,我认为其他答案中提到的英特尔 PT 功能与后处理和分析相结合最有可能以高速为您提供您想要的东西(即,某些东西就像性能上的个位数回归)。
如果您不关心性能,您可以使用任意数量的二进制检测框架来获取此信息。例如,valgrind框架有一个 cachegrind捕获每次内存访问并使用它们根据理想化缓存模型估计缓存行为的工具。
您几乎可以修改 cachegrind 工具以吐出您之后的访问列表以及时间戳。当然,问题在于 cachegrind 的运行速度可能比 native 应用程序慢 10 倍,因此您的时间戳将被“拉伸(stretch)”和扭曲(即,因为程序的各个部分可能具有不同的检测开销)。
这对您的申请是否重要取决于您。
Valgrind 的优点在于它不依赖于任何特定的硬件,并且可以跨不同的硬件架构工作。这可能也比让基于 Intel PT 的分析工作更容易 - 尽管我不是 100% 确定,因为我自己已经尝试过。
如果您在记录时不关心实际进程的总运行时间,但最需要准确的计时数字,您还可以考虑在 CPU 模拟器下运行您的进程,例如 Sniper x86 simulator或 gem5 Peter 在评论中提到。
This site其中描述了 CMP$im 工具可能对您非常有用。它能够使用 Intel 的 PIN technology 产生访问痕迹,@Leeor 在下面的评论中也提到了这一点。我建议您查看从该站点链接的作者的相关论文。
关于linux - 如何记录每次内存访问的时间戳痕迹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52098861/