toge's diary

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

valgrindで試す

id:higepon:20051229:1135837892

ひげぽんさんの日記より、メモリー周りの問題チェックを行ってくれるvalgrindを使ってみました。
MMXとかSSEとか使っていると実行に失敗してしまうので-marchとか-msse -mmmxとかしないほうが良いみたいです。

相変わらずOpenGLなプログラムだと馬鹿みたいにParam周りのメッセージが出まくる。こういうメッセージが鬱陶しい場合には、次のようなファイルを作って、--suppresions=hoge.supp みたいに渡すといいらしい。

{
  OpenGL_driver bug
  Memcheck:Cond
  obj:/usr/lib/libGL.so.1.0.8178
} 

しかしこの定義を細かく書くのが思いの他面倒臭い。まあ、今のところ --show-reachable=yes で出てくる reachable block(開放し忘れたメモリーブロックのことらしい)だけ見れればいいので、ログの最後の方だけ見ていればいいんですけどね。

忘れてた時用に、今使っているオプションを書いておこう。

 valgrind --log-file=valgrind.log  --leak-check=yes --show-reachable=yes --suppressions=util/valgrind.supp --error-limit=no --tool=memcheck [program] 

案の定destructor書き忘れとか、そもそもnewしたポインタをそのまま登録してそのままにしてたりとか、色々みつかってしまいました。まあプログラムが稼動している間ずっと使うデータが殆どなので半ば意図的ですが。
でもファイル読み込みクラスのdestructor書き忘れはちょっと恥かしいな

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も完璧ではないらしく、まだ不要な出力があるけれど、まあ大分大人しくなりました。