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