メモリリークチェックとしてsedを使って /proc/meminfo を整形するシェルスクリプトを書いていましたが, もっと細かく調べたく mtrace という便利ツールを使ったので書きます。
mtraceとは
mtrace は malloc, free などのメモリ操作関数からメモリリークを追跡してくれるツールです。glibc-utilsに含まれます。
また組み込みLinuxで使う場合には, ホストOSでクロスコンパイルすれば組み込み側で mtraceコマンド がなくてもメモリリークを調査できます。
mtraceの使い方
プロセスを動作させる側で環境変数をセットします。
$ echo $SHELL
/bin/bash
$ export MALLOC_TRACE=[出力ファイル]
次にホストOS側でmallocやcallocを含むプログラムを書きます。
使い方は以下の通り。簡単です。
#include "mcheck.h"
int main(void){
mtrace();
/* your code */
muntrace();
return 0;
}
プログラムを書いたら gcc -g でコンパイルします。
実行とログの見方
後は作成したプログラムを実行するだけです。exportで指定したディレクトリにログファイルを出力します。
@ /lib/libc.so.6:[0xcb5faf] + 0x805f378 0x160
わかりにくいログですが、実行ファイル(上記の場合だとShared Objectという動的ライブラリ),確保しているメモリのアドレス,メモリサイズの順です。
上記、プログラムをmtraceコマンドがない組み込みOS側で実行したとしてもホストOSにmtraceがあれば、以下コマンドでソースのリーク箇所と関連付けすることができます。
$ mtrace [プログラム名] [出力ファイル]
Memory not freed:
-----------------
Address Size Caller
0x08049a60 0x160 at /home/***.c:20
手軽さがいいですね!
[1] malloc/freeについて分かり易く解説したスライドがありました