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
その他参考文献- メモリリークの検出: mtrace と valgrind http://blogs.itmedia.co.jp/komata/2009/10/mtrace-valgrind.html
- プログラミング言語 7 - valgrind http://www.eidos.ic.i.u-tokyo.ac.jp/~tau/lecture/programming_languages/gen/slides/07-valgrind.pdf