有没有办法可以找到正在运行的进程的内存泄漏?我可以使用 Valgrind 在进程启动之前查找内存泄漏。我可以使用 GDB 将其附加到正在运行的进程。如何调试正在运行的进程的内存泄漏?
答案1
以下是几乎可以保证找到内存泄漏的步骤:
找出导致内存泄漏的进程的PID。
ps -aux
捕获
/proc/PID/smaps
并保存到某个文件中,例如BeforeMemInc.txt
.- 等到内存增加了。
- 再次捕获
/proc/PID/smaps
并保存它afterMemInc.txt
smaps
找到第一个和第二个之间的差异smaps
,例如diff -u beforeMemInc.txt afterMemInc.txt
记下内存增加的地址范围,例如:
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
使用 GDB 转储正在运行的进程的内存或使用以下命令获取核心转储
gcore -o process
我在运行进程中使用 gdb 将内存转储到某个文件。
gdb -p PID dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
现在,使用
strings
命令或hexdump -C
打印dump_outputfile.dump
strings outputfile.dump
您将获得可读的形式,您可以在其中将这些字符串定位到源代码中。
分析您的来源以查找泄漏。
答案2
答案3
在 Linux 上,您可以启用追踪在你的程序中,但这是一个代码更改。
在 OpenBSD 上,你可以尝试malloc 统计信息。
谷歌的泄漏检查器可能也值得一看,与 mtrace 不同,您可以使用它LD_PRELOAD
来避免重新编译。
答案4
IBM的净化可能是所有工具中最古老、最复杂的工具。它将标记代码中导致内存泄漏的行号。