如何找到正在运行的进程的内存泄漏?

如何找到正在运行的进程的内存泄漏?

有没有办法可以找到正在运行的进程的内存泄漏?我可以使用 Valgrind 在进程启动之前查找内存泄漏。我可以使用 GDB 将其附加到正在运行的进程。如何调试正在运行的进程的内存泄漏?

答案1

以下是几乎可以保证找到内存泄漏的步骤:

  1. 找出导致内存泄漏的进程的PID。

    ps -aux
    
  2. 捕获/proc/PID/smaps并保存到某个文件中,例如BeforeMemInc.txt.

  3. 等到内存增加了。
  4. 再次捕获/proc/PID/smaps并保存它afterMemInc.txt
  5. smaps找到第一个和第二个之间的差异smaps,例如

    diff -u beforeMemInc.txt afterMemInc.txt

  6. 记下内存增加的地址范围,例如:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
    
  7. 使用 GDB 转储正在运行的进程的内存或使用以下命令获取核心转储gcore -o process

  8. 我在运行进程中使用 gdb 将内存转储到某个文件。

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
    
  9. 现在,使用strings命令或hexdump -C打印dump_outputfile.dump

    strings outputfile.dump
    
  10. 您将获得可读的形式,您可以在其中将这些字符串定位到源代码中。

  11. 分析您的来源以查找泄漏。

答案2

我认为记忆力正是你想要的。

它通过附加正在运行的进程来调试内存泄漏,无需重新编译程序或重新启动目标进程。非常方便,适合生产环境。

它适用于 GNU/Linux 和 FreeBSD。

笔记:我是作者,有什么建议欢迎留言。

==编辑==

我还写了另一个工具利布拉克,它通过 LD_PRELOAD 挂钩内存函数。

无需修改目标程序。虽然您必须使用 LD_PRELOAD 重新启动进程,但您可以在运行期间启用/禁用检测。

由于没有信号陷阱,对性能的影响要小得多。

与类似工具(例如 mtrace)相比,它在可疑内存泄漏点打印完整的调用堆栈。

答案3

在 Linux 上,您可以启用追踪在你的程序中,但这是一个代码更改。

在 OpenBSD 上,你可以尝试malloc 统计信息

谷歌的泄漏检查器可能也值得一看,与 mtrace 不同,您可以使用它LD_PRELOAD来避免重新编译。

答案4

IBM的净化可能是所有工具中最古老、最复杂的工具。它将标记代码中导致内存泄漏的行号。

相关内容