linux - 如何记录每次内存访问的时间戳痕迹?

标签 linux memory cpu-architecture perf

有没有办法记录给定程序的每次内存访问,包括时间戳。可以使用 perf 来做到这一点吗?

最佳答案

如果您使用的是英特尔,我认为其他答案中提到的英特尔 PT 功能与后处理和分析相结合最有可能以高速为您提供您想要的东西(即,某些东西就像性能上的个位数回归)。

如果您不关心性能,您可以使用任意数量的二进制检测框架来获取此信息。例如,valgrind框架有一个 cachegrind捕获每次内存访问并使用它们根据理想化缓存模型估计缓存行为的工具。

您几乎可以修改 cachegrind 工具以吐出您之后的访问列表以及时间戳。当然,问题在于 cachegrind 的运行速度可能比 native 应用程序慢 10 倍,因此您的时间戳将被“拉伸(stretch)”和扭曲(即,因为程序的各个部分可能具有不同的检测开销)。

这对您的申请是否重要取决于您。

Valgrind 的优点在于它不依赖于任何特定的硬件,并且可以跨不同的硬件架构工作。这可能也比让基于 Intel PT 的分析工作更容易 - 尽管我不是 100% 确定,因为我自己已经尝试过。

如果您在记录时不关心实际进程的总运行时间,但最需要准确的计时数字,您还可以考虑在 CPU 模拟器下运行您的进程,例如 Sniper x86 simulatorgem5 Peter 在评论中提到。

This site其中描述了 CMP$im 工具可能对您非常有用。它能够使用 Intel 的 PIN technology 产生访问痕迹,@Leeor 在下面的评论中也提到了这一点。我建议您查看从该站点链接的作者的相关论文。

关于linux - 如何记录每次内存访问的时间戳痕迹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52098861/

相关文章:

android - 以编程方式检索 Android ARM 处理器版本

linux - 如何在github上上传Python脚本

linux - 关机前删除内存,Linux 是如何分配内存的?

c++ - 如何在 C++ 中处理可变大小的小对象的分配/释放

cpu - 沙桥和 haswell SSE2/AVX/AVX2 的每个周期的 FLOPS

assembly - 为什么后来的 ARM 指令集中不存在条件执行指令?

linux - sudo:更改目录权限时找不到命令

linux - 如何从分析器中获取每个样本的完整堆栈转储以用于火焰图?

c - 这个分配有什么问题?

java - java程序运行60M或90M正常吗?