在Linux程序中跟踪积极使用的内存

我想跟踪各种程序在特定状态下触摸多less内存。 比如说我有一个graphics程序。 当它最小化时,可能会占用更less的内存,因为它不会重新绘制窗口,这需要读取图像和字体,并执行大量的库函数。 这些对象在内存中仍然可以访问,但实际上并没有被使用。

top这样的工具的使用是有限的,因为他们只是告诉有多less内存映射到一个程序的地址空间,多less是驻留在物理RAM中。 同样,泄漏检测器只会告诉何时内存不可访问,而不是如果它没有被使用。

有没有一种现有的工具可以跟踪积极使用/未使用的内存这种方式? 如果可能的话,我想跟踪使用不仅在堆上,而且在stored procedures/库代码的内存。


编辑:我想澄清:我想知道一个程序实际上读取,写入或执行一定的点后,即一旦它达到一定的状态很多的内存。 尽pipe地址空间中的页面数量和驻留页面的数量是重要的度量,但这并不是我正在寻找的。

我现在正在追求三种方法:

  1. 我写了一个库,它清除了使用`mprotect`从/ proc / self / maps读取的所有内存区域(除了堆栈和自己的代码)的保护位。 它有一个段故障处理程序,恢复保护位并增加一个计数器。 我用`LD_PRELOAD`加载它,并在接收到信号时开始跟踪内存访问。 这产生了一些看似虚假地址的真正故障(在故障发生时它们不存储在任何寄存器或附近的存储器中)。
  2. 我写了一个`purge`程序,它使用`mmap`分配和读取内存,直到`mmap`返回一个错误。 这有希望强制执行目标进程中的所有页面,这些页面在“purge”运行时暂停。 然后,我使用`pidstat`来计算目标进程恢复时的页面插入次数。 这似乎工作,但它是一个非常钝的工具。 它没有给出任何关于哪些页面被触摸的信息。
  3. 我已经被告知valgrind允许你编写插件,这些插件会导致某些事件被执行,比如内存访问。 这看起来很有希望。

这可以从/ proc / pid / smaps中的数据导出。 这会为每个映射区域(包括堆栈,文本/数据和匿名映射区域)分配一个RSS值,以便您可以准确了解每个加载的对象以及堆栈和堆所驻留的内容。

一些可能有用的链接:

valgrind工具cachegrind在跟踪内存使用情况方面做得很好。

还有一些工具以图形方式显示cachegrind的输出。

编辑以响应更新的信息:
在valgrind出现之前,我使用了一个名为mpatrol的项目。
它使用mprotect()使页面成为只读并跟踪访问
页面。 它还允许指定何时开始和停止报告,
就像在第n个malloc之后,还有其他的规格。

它可能会做很多,或所有您正在寻找的功能。

一个警告,它比valgrind慢得多。