【问题标题】:Detect memory leak for a running process on Linux检测 Linux 上正在运行的进程的内存泄漏
【发布时间】:2023-04-08 05:11:01
【问题描述】:

我正在尝试检测进程在运行时是否存在内存泄漏 - 是否可以使用顶级 vmstat 等来执行此操作。我不想使用 valgrind 之类的工具,请在此处进行净化。

【问题讨论】:

  • 您可以随时自行跟踪。拥有自己的 malloc/free 包装器,用于跟踪分配的位置,并定期打印分配列表,或至少打印分配的总量。
  • 可能有用this

标签: c linux memory-leaks


【解决方案1】:

内存分析 使用 Perf 工具检查泄漏。

使用 perf 的探针的示例用法可能是检查 libc 的 malloc() 和 free() 调用:

$ perf probe -x /lib64/libc.so.6 malloc

$ perf probe -x /lib64/libc.so.6 free

添加了新事件: probe_libc:malloc (在 0x7eac0)

已创建探针。现在,让我们记录下 4 秒内所有系统的 malloc 和 free 的全局使用情况:

$ perf record -e probe_libc:malloc -agR sleep 4

$ perf record -e probe_libc:free -agR sleep 4

让我们记录下 4 秒内所有进程中 malloc 和 free 的使用情况:

$ perf stat -e probe_libc:free -e probe_libc:malloc -ag -p $(pgrep $process_name$) sleep 4

输出:

进程 ID“1153”的性能计数器统计信息:

11,312 probe_libc:free

11,644 probe_libc:malloc

4.001091828 秒时间过去

如果每次执行 perf 命令时 malloc 和 free count 之间的差异增加,则表明内存泄漏。

【讨论】:

    【解决方案2】:

    我认为测试过程(嵌入式内存统计模块)+远程监控工具可以工作。

    1) 正如 Joachim Pileborg 和 User1 所说,您的代码中需要一个嵌入式模块来计算内存统计信息。

    2) 但是为了方便,需要一个远程工具来进行监控,比如vmstat/top。而且我认为这个工具应该用这个嵌入式模块来开发。所以需要IPC机制。这是我认为的另一个话题。

    3) 有了上面的模块和工具,您可以软实时地从测试过程中获取信息,并且没有任何服务中断。

    【讨论】:

      【解决方案3】:

      没有。您无法使用 top 或 vmstat 检测内存泄漏。

      top 和 vmstat 有各自的用途。 top 有助于监控系统进程的总数及其状态(无论它们是正在运行还是等待)。

      上面显示的内存信息是系统范围的内存使用信息。它不会帮助您确定您的应用程序在哪里泄漏内存。

      vmstat 也是一样的,但是它提供了更多关于系统内存使用的信息,帮助系统程序员弄清楚内存管理层是如何工作的。

      【讨论】:

        【解决方案4】:

        如果您不想使用工具程序,您可以在程序中添加一些诊断:

        您可以在程序中使用mallinfo() 函数来检查使用了多少malloc。

        或者您可以通过 mtrace() 函数使用 malloc 跟踪。

        【讨论】:

        • mallinfo() 这些天或多或少没用。请参阅man mallinfoBUGS 部分。
        猜你喜欢
        • 2015-06-28
        • 2014-03-01
        • 2020-02-14
        • 2012-07-16
        • 1970-01-01
        • 2012-07-17
        • 2021-09-01
        • 2010-11-03
        • 2010-09-15
        相关资源
        最近更新 更多