valgrindを使ってみる

valgrindは書籍「Binary Hacks」を読んでいて知りました。
前々からLinux上でメモリーリークを検出するソフトないかなぁと思っていたので、とりあえず飛びついてみました。

Ubuntu 7.04上では

 $ sudo apt-get install valgrind

でインストール。

valgrindの使いかたに関してはWeb上でチラホラをみかけますね。

で、使ってみるとXやGtkとかのも色々でて…

こりゃ、共有ライブラリの中まで見にいってるなぁ。

共有ライブラリをvalgrindの調査からはずすやりかたをウェブとドキュメントから探してみると、結構みつかりますね。


基本は

 valgrind --leak-check=full --gen-suppressions=all ./実行ファイル名 

で標準出力に表示される中括弧で囲まれた部分を拾い出してテキストファイルに詰め込み、というタグをてきとうな名前で書き換えてあげ、

 valgrind --leak-check=full --suppressions=./テキストファイル名 ./実行ファイル名 

と指定して実行させるとうまくいきます。


この辺の作業(出力結果からテキストファイルを作る)が面倒なんでPerlで書きました。

!/usr/bin/perl

# check argument
# This program assume that file name to be affected is first argument.
if( !("" eq $ARGV[0]) ){
	print "#import file = $ARGV[0]\n";
}else{
	print "#error\n";
	exit(1);
}

# open reading file 
open(IN, $ARGV[0]) || die "#$ARGV[0] is not exist, Please confirm current directory";


# read file
$flag = 0;
$counter = 0;
$replacement = "";
while(defined($line =  ) ){
#	print $line;
	# search tag ( "{" )
	if( $line =~ /^\{/  ){
		print $line;
		$flag = 1;
	}elsif( $line =~ /$replacement/ ){
		print "   suppression_$counter\n";
		$counter += 1;
	}elsif( $line =~ /^\}/  ){
		print $line;
		$flag = 0;
	}elsif( $flag == 1 ){
		print $line;
	}
}
close(IN);

出力結果をテキストファイルにして、このスクリプトを通すと必要な箇所だけ抜き取るアンドタグをsuppressionアンダーバー数字に置き換えてくれます。