実行中のプロセスのメモリリークを見つける方法はありますか? Valgrindを使用して、プロセスの開始前にメモリリークを見つけることができます。 GDBを使用して、実行中のプロセスにアタッチできます。実行中のプロセスのメモリリークをデバッグするにはどうすればよいですか?
メモリリークの原因となっているプロセスのPIDを調べます。
ps -aux
/proc/PID/smaps
をキャプチャし、BeforeMemInc.txt
などのファイルに保存します。
/proc/PID/smaps
して保存afterMemInc.txt
最初のsmaps
と2番目のsmaps
の違いを見つけます。 g。と
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
これらの文字列をソースコードに配置できる、読み取り可能なフォームが表示されます。
ソースを分析してリークを見つけます。
memleax はあなたが望むものとまったく同じだと思います。
プログラムを再コンパイルしたり、ターゲットプロセスを再起動したりすることなく、実行中のプロセスのメモリリークをアタッチしてデバッグします。それは非常に便利で、生産環境に適しています。
GNU/LinuxとFreeBSDで動作します。
注:私は作者です。どんな提案でも歓迎します
==編集==
別のツール libleak を作成します。これは、LD_PRELOADによってメモリ関数をフックします。
また、ターゲットプログラムを変更する必要もありません。 LD_PRELOADで進行状況を再開する必要がありますが、実行中に検出を有効/無効にすることができます。
信号トラップがないため、パフォーマンスへの影響ははるかに少なくなります。
同様のツール(mtraceなど)と比較すると、疑わしいメモリリークポイントで完全なコールスタックが出力されます。
Linuxでは、プログラムで mtrace を有効にすることができますが、これはコードの変更です。
OpenBSDでは、 malloc stats を試すことができます。
Googleの リークチェッカー も一見の価値があるかもしれません。mtraceとは異なり、LD_PRELOAD
再コンパイルを回避します。
プログラムがソースコードで直接起動した後の割り当て監視のサポートを提供しなければ、あなたは運が悪いと思います。私が考えることができる2つの理由はここにあります:
ただし、プログラムが仮想マシン内で実行されている場合、その環境は割り当ての監視をサポートしている可能性があります。私は知っていますJavaには、実行中のプログラムまたはVMに接続するいくつかの割り当ておよびガベージコレクション監視ツール( visualVM など)があります。
IBMの Purify は、おそらく最も古く、最も洗練されたツールです。メモリリークの原因となるコードの行番号にフラグを立てます。