在Linux程序中跟踪活动使用的内存

时间:2009-05-13 23:14:51

标签: linux memory profiling

我想跟踪各个程序在特定状态下触摸的内存量。例如,假设我有一个图形程序。当它被最小化时,它可能会使用更少的内存,因为它不会重绘窗口,这需要读取图像和字体并执行大量的库函数。这些对象仍可在内存中访问,但实际上并未使用它们。

top这样的工具用途有限,因为它们只是告诉我们有多少内存映射到程序的地址空间,以及有多少内存驻留在物理RAM中。同样地,泄漏检测器只会告诉记忆何时不可访问,而不是仅仅是因为它没有被使用。

是否有现成的工具能够以这种方式跟踪活动使用/未使用的内存?如果可能的话,我不仅要跟踪堆上的使用情况,还要跟踪存储程序/库代码的内存。


编辑:我想澄清一下:我想知道一个程序在某一点之后实际读取,写入或执行的内存,即一旦达到某个状态。虽然地址空间中的页数和驻留页数是重要的测量值,但这不是我想要的。

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

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

2 个答案:

答案 0 :(得分:2)

valgrind工具cachegrind可以很好地跟踪内存使用情况。

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

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

它可以执行您要查找的许多或所有功能。

有一点需要注意,很多比valgrind慢。

答案 1 :(得分:2)

这可以从/ proc / pid / smaps中的数据派生。这会为每个映射区域(包括堆栈,文本/数据和匿名映射区域)分解RSS值,因此您可以准确地查看每个已加载对象以及堆栈和堆的驻留内容。

某些可能有用的链接: