我想跟踪各个程序在特定状态下触摸的内存量。例如,假设我有一个图形程序。当它被最小化时,它可能会使用更少的内存,因为它不会重绘窗口,这需要读取图像和字体并执行大量的库函数。这些对象仍可在内存中访问,但实际上并未使用它们。
像top
这样的工具用途有限,因为它们只是告诉我们有多少内存映射到程序的地址空间,以及有多少内存驻留在物理RAM中。同样地,泄漏检测器只会告诉记忆何时不可访问,而不是仅仅是因为它没有被使用。
是否有现成的工具能够以这种方式跟踪活动使用/未使用的内存?如果可能的话,我不仅要跟踪堆上的使用情况,还要跟踪存储程序/库代码的内存。
编辑:我想澄清一下:我想知道一个程序在某一点之后实际读取,写入或执行的内存,即一旦达到某个状态。虽然地址空间中的页数和驻留页数是重要的测量值,但这不是我想要的。
我现在正在寻求三种方法:
答案 0 :(得分:2)
valgrind工具cachegrind可以很好地跟踪内存使用情况。
还有一些工具可以显示cachegrind的输出 图形。
编辑以回复更新的信息:
在valgrind出现之前,我使用了一个名为mpatrol的项目
它使用mprotect()使页面为只读并跟踪对
的访问
页面。它还允许指定何时开始和停止报告,
喜欢在第n个malloc之后,以及其他规格。
它可以执行您要查找的许多或所有功能。
有一点需要注意,很多比valgrind慢。
答案 1 :(得分:2)
这可以从/ proc / pid / smaps中的数据派生。这会为每个映射区域(包括堆栈,文本/数据和匿名映射区域)分解RSS值,因此您可以准确地查看每个已加载对象以及堆栈和堆的驻留内容。
某些可能有用的链接: