2016-04-20 4 views
2

最近マイクロコントローラのCプロジェクトに携わっています。 プロジェクトにはmalloc()やcalloc()がたくさんあります。 私の質問は、割り当てられたメモリの存続期間、つまりメモリが解放されるまでに割り当てられた時間と解放された場所を記録するために、実行時に配列または別の動的割り当て配列を使用することです。 ありがとうございました。ダイナミックメモリ割り当ての使用を記録する

+0

Cプログラムのメモリマネージャは* you *です。割り当てられているメモリの量を把握することは、それが必要な場合はあなた次第です。この目的のためにグローバルを使用することができます。 –

+0

@ DavidC.Rankin - それは理論ですが、フリースレッドコードのように、メモリリークを追跡するのは信じられないほどのデバッグ時間を要します。 – Mike

答えて

4

これを手作業で行うには、まず、malloc、calloc、freeのすべてのインスタンスを独自の関数(たとえば、_malloc、_calloc、および_free)で置き換える必要があります。生産のために、これらは、それによってオーバーヘッドを運んでいないオリジナルの関数として定義することができますが、デバッグコードのために、あなたがそれらを独自の関数を呼び出すことがあります。

#ifdef _DEBUG 
#define _malloc(s) myMalloc(s,__FILE__, __LINE__) 
#define _calloc(b,n) myCalloc (b,n,__FILE__, __LINE__) 
#define _free(p) myFree (p, __FILE__, __LINE__) 
#else 
#define _malloc malloc // If not debugging, just use the default 
#define _calloc calloc 
#define _free free 
#endif 

#ifdef _DEBUG // Or whatever your compiler preset is 
void *myMalloc (size_t sz, const char *pszFile, unsigned long line) 
{ 
    // Save the details in a table with the time 
    ... 
    return malloc (sz); 
} 
void myFree (void *ptr, const char *pszFile, unsigned long line) 
{ 
    // Process the table, do time calculations etc and then remove it 
    free (ptr); 
} 
#endif 

これは本当にmallocとfreeをオーバーロードするための唯一の方法です。定数FILELINEは、メモリの割り当てと解放の場所を示します。 NB。 myMallocで表スペースを割り振る場合は、_mallocではなくmallocを使用するか、無限ループが発生する可能性があります。

4

glibcを使用している場合は、mtrace関数とツールを使用して、ソースコードを変更せずにすべてのメモリ割り当てとリリースをトレースできます。

mtrace()関数は、メモリ割り当て関数(malloc(3)、realloc(3)memalign(3)、free(3))のフック関数をインストールします。これらのフック関数は、メモリの割り当てと割り当て解除に関するトレース情報 を記録します。トレース情報を使用して、メモリリークを検出したり、プログラム内の未割り当てメモリを解放しようとしたりすることができます。

mtrace()が呼び出されると、トレース情報が と記録されるファイルのパス名を含む環境変数MALLOC_TRACEの値がチェックされます。パス名が正常に開かれた場合、パス名はゼロに切り捨てられます。

トレースファイルを解釈するためのコマンドラインツール(mtrace)も用意されています。

参照:

http://linux.die.net/man/3/mtrace

http://linux.die.net/man/1/mtrace

+0

私が知る限り、mtrace()はglibcに含まれており、プログラムがmtrace()を実行すると、 "MALLOC_TRACE"が指すファイルにデータが書き込まれます。しかし、私のプロジェクト環境は、OSを持たないマイクロコントローラです。 mtrace()を使用することは可能ですか?ところで、このプロジェクトではARMツールチェーンを使用しています。 –

2

あなたはthis oneのようなライブラリを使用しようとするかもしれませんが、これは実際には特定のコントローラ用の開発環境の種類によって異なります。それは先進的なものであり、すべての可能な鐘と笛が開発者のために利用可能であり、同様に機能がかなり制限される可能性があるので、上記の@Mikeで提案されたようなカスタムソリューションで終わるかもしれません。

関連する問題