
有沒有辦法可以找到正在運行的進程的記憶體洩漏?我可以使用 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的淨化可能是所有工具中最古老、最複雜的工具。它將標記程式碼中導致記憶體洩漏的行號。