valgrind でプロファイル対象から特定の共有ライブラリを除外する方法.

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 に記述された共有ライブラリが,プロファイル対象から除外されています.