概要
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 を活用してメモリリークを予防しよう、ヨシ!