【メモリリーク】mtraceの使い方【glibc】

| 0件のコメント

メモリリークチェックとして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について分かり易く解説したスライドがありました

コメントを残す

必須欄は * がついています