最近マイクロコントローラのCプロジェクトに携わっています。 プロジェクトにはmalloc()やcalloc()がたくさんあります。 私の質問は、割り当てられたメモリの存続期間、つまりメモリが解放されるまでに割り当てられた時間と解放された場所を記録するために、実行時に配列または別の動的割り当て配列を使用することです。 ありがとうございました。ダイナミックメモリ割り当ての使用を記録する
答えて
これを手作業で行うには、まず、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をオーバーロードするための唯一の方法です。定数FILEとLINEは、メモリの割り当てと解放の場所を示します。 NB。 myMallocで表スペースを割り振る場合は、_mallocではなくmallocを使用するか、無限ループが発生する可能性があります。
glibcを使用している場合は、mtrace
関数とツールを使用して、ソースコードを変更せずにすべてのメモリ割り当てとリリースをトレースできます。
mtrace()関数は、メモリ割り当て関数(malloc(3)、realloc(3)memalign(3)、free(3))のフック関数をインストールします。これらのフック関数は、メモリの割り当てと割り当て解除に関するトレース情報 を記録します。トレース情報を使用して、メモリリークを検出したり、プログラム内の未割り当てメモリを解放しようとしたりすることができます。
mtrace()が呼び出されると、トレース情報が と記録されるファイルのパス名を含む環境変数MALLOC_TRACEの値がチェックされます。パス名が正常に開かれた場合、パス名はゼロに切り捨てられます。
トレースファイルを解釈するためのコマンドラインツール(mtrace
)も用意されています。
参照:
私が知る限り、mtrace()はglibcに含まれており、プログラムがmtrace()を実行すると、 "MALLOC_TRACE"が指すファイルにデータが書き込まれます。しかし、私のプロジェクト環境は、OSを持たないマイクロコントローラです。 mtrace()を使用することは可能ですか?ところで、このプロジェクトではARMツールチェーンを使用しています。 –
あなたはthis oneのようなライブラリを使用しようとするかもしれませんが、これは実際には特定のコントローラ用の開発環境の種類によって異なります。それは先進的なものであり、すべての可能な鐘と笛が開発者のために利用可能であり、同様に機能がかなり制限される可能性があるので、上記の@Mikeで提案されたようなカスタムソリューションで終わるかもしれません。
- 1. ダイナミックメモリ割り当て
- 2. C - ダイナミックメモリ割り当て
- 3. ダイナミックメモリ割り当てにmallocとfreeを使用する方法
- 4. ダイナミックメモリ割り当てを使用した2D配列の理解
- 5. ダイナミックメモリQTでの割り当て解除
- 6. ダイナミックメモリ割り当てを使用してCで行列を扱うには?
- 7. ダイナミックメモリ割り当てのないC++の戻り配列?
- 8. コマンドラインでJFRを使って割り当てを記録する方法は?
- 9. 構造体のフィールドをc(ダイナミックメモリ割り当て)で出力する
- 10. ダイナミックメモリ割り当てを使用してファイルを1行ずつプリントアウトする方法は?
- 11. ダイナミックメモリ割り当て後にアレイを初期化する方法は?
- 12. Objective-Cの記憶域割り当て
- 13. 割り当てと指数表記
- 14. ポインタのベクトルから要素を消去し、以前にnew演算子で割り当てられたダイナミックメモリの割り当てを解除しますか?
- 15. オブジェクトの配列(オブジェクトのダイナミックメモリ割り当て)からオブジェクトを削除(メモリ解放)するには
- 16. xcode/swiftで値の割り当てを割り当てます。
- 17. newrelicのコマンドラインを使用してサーバーポリシーを割り当てる
- 18. 別のモジュールを使用して変数を割り当てる?
- 19. mallocを使用してNSStringの配列を割り当てる?
- 20. オブジェクトの分解を使用してクラスメンバーを割り当てる
- 21. iは私のプロジェクトのためのtcpdumpでmallocををログに記録するコードの少しを使用しようとしている割り当てサイズ
- 22. javacript関数内の出力または割り当てられた変数をログに記録する
- 23. 学校の割り当てにLoopコマンドを使用する
- 24. Androidのビデオ録画.. mediaRecorderを使用せずに記録するビデオにとにかくありアンドロイドメディアに記録
- 25. ブーストを使用する::割り当てる::
- 26. 割り当てられたアドレスで構造をインスタンス化する(割り当て割り当て)
- 27. ASP.NET登録時の既定のユーザーロールの割り当て
- 28. javascriptを使用して画像にリンクを割り当てる
- 29. リテラルを使用してテンプレートタイプに値を割り当てる
- 30. WPFバインディングを使用して静的リソースを割り当てる
Cプログラムのメモリマネージャは* you *です。割り当てられているメモリの量を把握することは、それが必要な場合はあなた次第です。この目的のためにグローバルを使用することができます。 –
@ DavidC.Rankin - それは理論ですが、フリースレッドコードのように、メモリリークを追跡するのは信じられないほどのデバッグ時間を要します。 – Mike