メモリーリーク調査方法


MTRACEツールを使用する

★使用手順

環境変数の設定

まずはLinuxの環境変数の設定から...

$> export MALLOC_TRACE="log file name"

次にソースコードの編集

◆ ヘッダのインクルード

#include <mcheck.h>

次にソースにメモリチェックする部分に以下のコードを追加

mtrace();←メモリチェック開始

muntrace();←メモリチェック終了

◆ 実行

以下のようなコードを実行する int main ()
{
    mtrace();
    char* test = new char[10];
    test = new char[10];

    delete[] test;
    Test t = new Test ();
    muntrace();
}

◆ 結果

これを実行すると以下のようなログが指定したログファイルに 記述されます。(実際には値などは違います)
= Start
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049a98 0x1
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049aa8 0x1
@ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x400b0de3] - 0x8049aa8
@ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049ab8 0x64
= End

new と delete の部分でこれが書かれます。

+ は new
- は delete

で、mtrace "log file name" 実行すると以下のように表示され、 メモリを解放していない部分が分かります。

Memory not freed:
-----------------
Address Size Caller
0x08049a98 0x1 at 0x400b22fe
0x08049ab8 0x64 at 0x400b22fe

アドレスしかわかりませんがコンパイル時とかにマップファイルを
出力してあげれば関数名なども分かると思います。

こんな機能も...

また、以下の環境変数を指定することでメモリ領域の破壊などに
ついてはデバッグしやすくなるかもしれません。

export MALLOC_CHECK_=”値”

値は0〜3です。
MALLOC_CHECK_ = 0 何もしない
MALLOC_CHECK_ = 1 標準エラー出力に診断メッセージ表示
MALLOC_CHECK_ = 2 abort
MALLOC_CHECK_ = 3 1と2の両方

以上