gpt4 book ai didi

linux - 跟踪 Linux 程序中活跃使用的内存

转载 作者:IT王子 更新时间:2023-10-29 00:56:01 26 4
gpt4 key购买 nike

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

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

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


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

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

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

最佳答案

这可以从/proc/pid/smaps 中的数据导出。这会为每个映射区域(包括堆栈、文本/数据和匿名映射区域)拆分出一个 RSS 值,因此您可以准确地看到每个加载对象以及堆栈和堆的常驻内容。

一些可能有用的链接:

关于linux - 跟踪 Linux 程序中活跃使用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/860878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com