toge's diary

コンピュータ関連の趣味をつらつらと。

valgrindの出力を比較的お手軽に抑える方法

きちんとマニュアル読めばsuppressionsの定義ファイルをお手軽に作る方法が書いてありました。

Note: By far the easiest way to add suppressions is to use the --gen-suppressions=yes flag described in Command-line flags for the Valgrind core.

だってさ。ということで--gen-suppressions=yesを追加して実行。

==13873==    by 0x8054E81: title::eventLoop(title::Model&) (ModelInit.cpp:39)
==13873==    by 0x804DCC2: main (BoatRace.cpp:159)
{
   <insert a suppression name here>
   Memcheck:Cond
   fun:X11_SetKeyboardState
   fun:X11_PumpEvents
   fun:SDL_PumpEvents
   fun:SDL_PollEvent
   fun:_ZN5title9eventLoopERNS_5ModelE
   fun:main
}
==13873== 
==13873== Syscall param ioctl(generic) points to uninitialised byte(s)
==13873==    at 0x1BCAD849: ioctl (in /lib/libc-2.3.5.so) 

こんなかんじで普通のメッセージと一緒にルールも表示されます。きっとルールだけ他のファイルに出すとか出来るんだろうけど、もう調べたくないので、rule名(<insert a suppression name here>って部分)をuniqにするついでに、awkで書いてしまいます。

BEGIN{
  rule_index=0;
}

/^=/ {
  next;
}

/<insert a suppression name here>/ {
  print "   rule_" rule_index++;
  next;
}

{
  print $0;
} 

うぬ、でこのスクリプトを使ってルールが出てくるので、必要ないやつを視認で削除して、--gen-suppressions=noなvalgrindに食わせるわけです。
残念ながら--gen-suppressions=allも完璧ではないらしく、まだ不要な出力があるけれど、まあ大分大人しくなりました。