実行中のプロセスでメモリリークを見つける方法はありますか? 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
ソースコードでこれらの文字列を見つけることができる読み取り可能な形式が得られます。
漏れの原因を分析してください。
答え2
私の考えではメモリあなたが望むもの。
プログラムを再コンパイルするか、ターゲットプロセスを再起動せずに実行中のプロセスに接続して、メモリリークをデバッグします。非常に便利で、生産環境に適しています。
GNU/Linux と FreeBSD で動作します。
メモ:私は著者です。提案がある場合はメッセージを残してください。
==編集==
私も別のツールを書いたリブラック、LD_PRELOADを介してメモリ機能を接続します。
ターゲットプログラムを変更する必要はありません。プロセスを再開するにはLD_PRELOADを使用する必要がありますが、実行時に検出を有効/無効にできます。
信号トラップがないため、パフォーマンスへの影響ははるかに少なくなります。
mtraceのような同様のツールと比較して、メモリリークが疑われるときにコールスタック全体を印刷します。
答え3
答え4
IBM浄化するおそらく最も古く、最も複雑なツールです。メモリリークを引き起こしたコードの行番号を表示します。