実行中のプロセスのメモリリークを見つける方法は?

実行中のプロセスのメモリリークを見つける方法は?

実行中のプロセスでメモリリークを見つける方法はありますか? Valgrindを使用すると、プロセスが開始される前にメモリリークを見つけることができます。 GDBを使用して実行中のプロセスに接続できます。実行中のプロセスでメモリリークをデバッグする方法は?

答え1

メモリリークを見つけるためにほぼ保証される手順は次のとおりです。

  1. メモリリークを引き起こすプロセスのPIDを学びます。

    ps -aux
    
  2. /proc/PID/smaps一部のファイルをキャプチャして保存しますBeforeMemInc.txt

  3. メモリが増えるのを待ちます。
  4. もう一度キャプチャ/proc/PID/smapsして保存してくださいafterMemInc.txt
  5. smaps最初と2番目の違いを見つけてくださいsmaps

    diff -u beforeMemInc.txt afterMemInc.txt

  6. メモリが増えるアドレス範囲を書き留めます。たとえば、次のようになります。

       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
    
  7. GDBを使用して実行中のプロセスのメモリをダンプするか、次のコマンドを使用してコアダンプを取得します。gcore -o process

  8. 私はプロセスの実行中にいくつかのファイルにメモリをダンプするためにgdbを使用しています。

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
    
  9. 次に、stringsコマンドを使用またはhexdump -C印刷します。dump_outputfile.dump

    strings outputfile.dump
    
  10. ソースコードでこれらの文字列を見つけることができる読み取り可能な形式が得られます。

  11. 漏れの原因を分析してください。

答え2

私の考えではメモリあなたが望むもの。

プログラムを再コンパイルするか、ターゲットプロセスを再起動せずに実行中のプロセスに接続して、メモリリークをデバッグします。非常に便利で、生産環境に適しています。

GNU/Linux と FreeBSD で動作します。

メモ:私は著者です。提案がある場合はメッセージを残してください。

==編集==

私も別のツールを書いたリブラック、LD_PRELOADを介してメモリ機能を接続します。

ターゲットプログラムを変更する必要はありません。プロセスを再開するにはLD_PRELOADを使用する必要がありますが、実行時に検出を有効/無効にできます。

信号トラップがないため、パフォーマンスへの影響ははるかに少なくなります。

mtraceのような同様のツールと比較して、メモリリークが疑われるときにコールスタック全体を印刷します。

答え3

Linuxでは有効にできます。プログラムではコードの変更です。

OpenBSDでは試してみることができますmalloc 統計

Googleの漏れチェッカーmtraceとは異なり、これを使用すると再コンパイルを避けることができるので、見てみる価値がありますLD_PRELOAD

答え4

IBM浄化するおそらく最も古く、最も複雑なツールです。メモリリークを引き起こしたコードの行番号を表示します。

関連情報