valgrind, x86 linux プログラムデバッガ & プロファイラ

by syoyo

==1278== Use of uninitialised value of size 4
==1278==    at 0x806D014: ri_vector_mul (in /home/syoyo/work/lucille/src/lsh/lsh
)
==1278==    by 0x4242C99E: ???

Matt Pharr 大先生も御用達? の valgrind というツールがあります。

http://valgrind.kde.org/

このツールは、メモリリークの検出、スレッドエラーの検出、
キャッシュのプロファイル、ヒープのプロファイルなどと、
非常に高性能かつ多機能なメモリ関連ツールです。

本ツールの大きな特徴としては、
たとえば dmalloc のように特別になんらかのライブラリとリンクしたり、
ソースコードを書き換える必要はなく、すでにコンパイルされたプログラムを
そのまま処理できる点でしょう。

もちろん、デバッグ情報付きでコンパイルされていれば、
たとえばメモリエラーが起きたときには、
そのエラーの起きた関数名と行番号が出力されます。

x86 linux 限定であるという制約はあるものの、
Mac OS X の malloc_history, leaks と並び非常に使えるツールです。
(PowerPC/linux への移植版も行われているようです)

Windows でも、colinux で動かせば問題なく使えます。

ためしに lucille に valgrind をかけて見ました。

...
==1278== More than 30000 total errors detected.  I'm not reporting any more.
==1278== Final error counts will be inaccurate.  Go fix your program!
==1278== Rerun with --error-limit=no to disable this cutoff.  Note
==1278== that errors may occur in your program without prior warning from
==1278== Valgrind, because errors are no longer being displayed.
...
==1278== ERROR SUMMARY: 30000 errors from 6 contexts (suppressed: 2 from 1)
==1278== malloc/free: in use at exit: 6136545 bytes in 37165 blocks.
==1278== malloc/free: 98898 allocs, 61733 frees, 13423847 bytes allocated.
==1278== For a detailed leak analysis,  rerun with: --leak-check=yes
==1278== For counts of detected errors, rerun with: -v

うーん、メモリリークや未使用変数の利用がいっぱい…

 

valgrind の GUI フロントエンドとして、
キャッシュプロファイルやコールグラフの可視化を行う
KCachegrind というのもあります。


http://kcachegrind.sourceforge.net/cgi-bin/show.cgi/KcacheGrindIndex

Advertisements