Valgrind

モリーリークのチェックツールを探していて、なかなか良いのがないなぁ、と思っていたところ、やっとのことで見つけたのがこの Valgrind

最初、memwatch にトライしたんだけど、ソースに memwatch のヘッダをインクルードして、memwatch.c を一緒にコンパイル・リンクするという手順で、「ひょっとしたらこういうパターンはだめかな」というのを思いついて、試して見たら見事にだめだった(^^;

だめなパターンというのは「exit でプログラムを終了させる」パターン。memwatch の手順からして「atexit でログを吐き出すようにしてるんじゃないかなぁ」と思って、「だと _exit で抜けたら、ログに吐き出せないよなぁ」と想像した次第。チェックしようとしているプログラムが _exit を使っているんで、これじゃぁ使えないと。

あと、mtrace も試して見たけど、確かに1つリークがあることは発見したけど、どこで発生したものかが皆目検討付かず。

今日になって Valgrind を発見して使って見たら、見事、リーク個所を発見! ま、発見されたのは実に単純な「ファイルの閉じ忘れ」だったのが情けなかったけど(^^;。

ちなみに、Valgrind の stable release である 2.0.0 では終了時に Segmentation fault を起こしていたので、2.1.3 を持ってきて実行。こちらの方は問題なし。でも、同じメジャーバージョンが「2」でもインタフェースがずいぶん変わっているのにびっくりした。2.0.0 では valgrind に調べたいプログラムを指定するだけだったのが、2.1.3 では必ず --tool=なんとか、というのを付ける必要がある。--tool=memcheck が、ほぼ従来の Valgrind の機能のようです。--tool にいろいろ指定できるらしいので、なかなか奥が深そう。