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

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

実行中のプロセスでメモリリークを見つける方法はありますか? 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. 漏れの原因を分析してください。

おすすめ記事