実行中のプロセスでメモリリークを見つける方法はありますか? Valgrindを使用すると、プロセスが開始される前にメモリリークを見つけることができます。 GDBを使用して実行中のプロセスに接続できます。実行中のプロセスでメモリリークをデバッグする方法は?
ベストアンサー1
メモリリークを見つけるためにほぼ保証される手順は次のとおりです。
メモリリークを引き起こすプロセスのPIDを学びます。
ps -aux
/proc/PID/smaps
一部のファイルをキャプチャして保存しますBeforeMemInc.txt
。- メモリが増えるのを待ちます。
- もう一度キャプチャ
/proc/PID/smaps
して保存してくださいafterMemInc.txt
smaps
最初と2番目の違いを見つけてください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
ソースコードでこれらの文字列を見つけることができる読み取り可能な形式が得られます。
漏れの原因を分析してください。