valgrind の --suppressions オプションを使うと,プロファイル対象から特定の共有ライブラリ(hoge.so)を除外出来ます.
valgrind の問題点
valgrind はlinux用のメモリリーク検出ツールとして有名ですが,他にも
- 初期化していない変数値を参照している個所
- キャッシュのヒット状況
などをプロファイリングできる強力なツールです.開発中のプログラムのデバッグが一段落したら,潜在的なバグを見つけるために一度は valgrind でチェックすべきです.
使い方も簡単です.たとえば a.out をチェックしたい場合は
$ valgrind ./a.out
とするだけ.
ただ,a.out がリンクしているライブラリ, たとえば /lib/ld-2.5.so に潜在的なバグがあると,そのバグも検出してしまいます.
具体例として,たとえば debian の experimental で
$ valgrind /bin/ls
とすると,以下のようなバグ候補が大量に出力されます.
==14413== Conditional jump or move depends on uninitialised value(s) ==14413== at 0x400B0F1: (within /lib/ld-2.5.so) ==14413== by 0x400400C: (within /lib/ld-2.5.so) ==14413== by 0x4014B45: (within /lib/ld-2.5.so) ==14413== by 0x4000C5F: (within /lib/ld-2.5.so) ==14413== by 0x4000846: (within /lib/ld-2.5.so)
このメッセージの意味するところは, /lib/ld-2.5.so (いわゆる libc6) 内部で,初期化していな変数を使った条件分岐が行われている,ということです.
--suppressions オプション
libc6 をデバッグしている訳ではないので,このようなエラーは無視したい,そのような場 --suppressions オプションを使います.
$ valgrind --suppressions=libc6-hack.sup /bin/ls
"--suppressions" オプションは ファイル名を引数に取ります.指定するファイルは valgrind の設定ファイルです.上記の例の場合, libc6-hack.sup は以下のような内容になります.
## ## Suppressions for debian experimental libc6 (glibc-2.5) { Debian-experimental-libc6-hack2 Memcheck:Cond obj:/lib*/ld-2.5*.so obj:/lib*/ld-2.5*.so obj:/lib*/ld-2.5*.so obj:/lib*/ld-2.5*.so }
この設定で /lib*/ld-2.5*.so にマッチする共有ライブラリは, Memcheck: Cond のプロファイル対象から除外されます.
実は,valgrind はデフォルトで幾つかの共有ライブラリを プロファイル対象から除外しています.どのようなファイルを除外しているか,については, "-v"オプションを付けると判ります.
$ valgrind -v /bin/ls
debian/experimental の場合は
--14514-- Reading suppressions file: /usr/lib/valgrind/debian-libc6-dbg.supp --14514-- Reading suppressions file: /usr/lib/valgrind/default.supp
と出るように /usr/lib/valgrind 以下にある二つのファイル,debian-libc6-dbg.supp と default.supp に記述された共有ライブラリが,プロファイル対象から除外されています.