概要
Valgrind というツールを使うことで、malloc() の free() 忘れによるメモリリークなどを防止できるとのこと。
このページでは、Valgrind の基本的な使用方法をメモする。
Ref:
メモリチェックとは?
動的メモリ確保とヒープメモリ
malloc() 関数などで動的にメモリを確保する時は、ヒープという領域のメモリを使用する。
malloc() で確保したメモリは free() 関数で解放されるまで確保され続ける。そのため不用意に malloc() などを使いまくり、なおかつ free() をサボっていると、ヒープを圧迫し、最悪クラッシュしてしまう(らしい)。こうした free() 忘れを、メモリリークという(とのこと)[1]。
Valgrind によるメモリチェック
動的メモリ確保に関連するバグは、デバッグが非常に困難であるため、できるだけ避けたい。Linux 環境であれば、こうしたバグの解析に有用なツールである、Valgrind を使うことができる。Valgrind は、malloc() で確保した領域を超えた読み書き、メモリリーク、重複 free() などを検出してくれる[1]。
Valgrind は以下のように使用する。
$ Valgrind hoge
ここで hoge は、解析対象の実行バイナリである。
また、以下のコマンドを使用することで、より詳細な情報を取得できる。
--leak-check=full
なお解析対象の実行バイナリをビルドする際には、-g、-O0 オプションを付けるべし。
Valgrind の使用例
基本的な使い方
HEAP SUMMARY の読み方
↑は -g, -O0 オプションを付けてビルドした実行ファイルを、--leak-check=full オプションを付けて valgrind で解析した時に、HEAP SUMMARY の下に出てくる情報。
確定的な(?)解放漏れの箇所を教えてくれる。
例えば
hoge bytes in 1 blocks are definitely lost in loss record ~
at ~~~~~~: fuga (in piyo.so)
by ~~~~~~:
by ~~~~~~:
by ~~~~~~:main (foo.c :bar)
の場合、foo.c の bar 行目でメモリ解放漏れがあり、元をたどると piyo.so の fuga でメモリが確保されている、みたいな感じだと思う。たぶん。知らんけど。
注意
Valgrind を十全に活用するためには、実行バイナリにデバッグ情報がついていることが重要となる。また、最適化の度合いが深いと、デバッグに苦労する場合があるらしい。リンクさせるライブラリも含めて、ビルド時には -g、-O0 オプションを忘れずにつけておきたい。
まとめ
Valgrind を活用してメモリリークを予防しよう、ヨシ!

