valgrind を使うと簡単にメモリリークしてるかどうか(Cレベルで free されていない変数がないかどうか)を調べることができる。

正式には、valgrind はもはやフレームワークなので、いろいろツールがあってメモリリーク検査以外のこともできるが、valgrind と言ったらとりあえずメモリリークチェッカを思い浮かべておくぐらいで良さそうだ。デフォルトが --tool=memcheck だし。

インストール

sudo yum install valgrind

メモリリーク検出

$ valgrind --leak-check=full ./program arg1 arg2

pid 指定で attach はできない。

==10945== LEAK SUMMARY:
==10945==    definitely lost: 8 bytes in 1 blocks.
==10945==      possibly lost: 0 bytes in 0 blocks.
==10945==    still reachable: 0 bytes in 0 blocks.
==10945==         suppressed: 0 bytes in 0 blocks.

のような出力が下のほうに出て来るので、defnitely lost があったらまぁ怪しい。

実際、 snmpd や gmond (ganglia) にあてると definitely lost が出て来るバージョンとかあって、メモリリークしてるなコレ、というのが一発でわかった。
snmpd の例 > https://gist.github.com/sonots/103546646a98fbba6c80

cf. http://www.ninxit.com/blog/2009/04/26/valgrind-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/ 

ヒーププロファイラ(メモリの使用量を計測)

valgrind はもはやフレームワークなので、他にもヒーププロファイラツールなんかもある。 

$ valgrind --tool=massif ./program arg1 arg2

massif.out. ファイルができる。

cf. http://fugaga.hatenablog.com/entry/2013/12/01/193911

コールトレース

valgrind はもはやフレームワークなので、他にもコールグラフをとるツールなんかもある。

$ valgrind --tool=callgrind

cf. http://dsas.blog.klab.org/archives/51024395.html 

その他参考文献