Cプログラムの各ステップで割り当てられ、再割り当てされ、解放されたメモリの量を追跡する方法はありますか?私は、プログラム内のすべての割り当てを段階的に意味し、エラー、メモリリーク、またはそのような方法ではありません。
3 に答える
はい、それを行う方法があります。私が知っているのは一通りだけです。Pinと呼ばれます。理想的には、バイナリにアタッチするpin tool
と、すべてのメモリアクセスなどにアクセスできるようになります。ソースコードを変更する必要はありません。
これには、Pin ツールを作成するためのプログラミングが必要です。ピン ツールは基本的に、プログラムの実行で監視するパラメーターとその方法を指定するコードです。非常に柔軟です。ただし、学習曲線が少しあることに注意してください。したがって、これは学習する時間がある場合にのみ理想的です。しかし、すぐに結果を出すと、目的を達成できない可能性があります。
また、デフォルトでいくつかのツールが提供されていることにも注意してくださいPin
。これらのツールは、興味のあるものや、ニーズに合わせて変更できるものです。あなたが(私の頭の中で)見たいかもしれないツールのいくつかは次のとおりです。 1. Pinatrace 1. MallocTrace
何か書き間違えたかもしれません。しかし、あなたが望むものを正確に与えるかもしれないものはたくさんあります!
そして、実行可能な他の解決策は@happydaveによって言及されたものであり、私が推奨しないのは、malloc
およびfree
関数を再定義して、malloc/freeを呼び出すときに、関心のあるパラメーターを記録することです.唯一の理由malloc を再定義するよりも固定することをお勧めします。時間があり、将来、トレーサーに機能を追加する予定がある場合です。
一般的なアプローチは、マクロで malloc/free をオーバーライドすることです。
#define malloc(size) custom_malloc(size, __FILE__, __LINE__)
その後、custom_malloc に通常の malloc を実行させ、割り当て情報をファイル (またはそれでやりたいこと) にダンプすることもできます。
フリーで解放されているメモリの量を追跡するための 1 つのオプションは、malloc 呼び出しごとに追加のフィールドを割り当てて、割り当てられたサイズを格納することです。これにより、解放時に確認できます。または、malloc/free ポインターをファイルにダンプし、スクリプトを記述して後処理し、並べることもできます。情報をどうしたいかによって多少異なります。
MFC 環境の Windows では、DEBUG_NEW が 1 つの方法です。
http://msdn.microsoft.com/en-us/library/aa297313%28v=vs.60%29.aspx
もう 1 つは、標準ファイルと行番号を使用して関数の alloc ファミリーを再定義することです。
#define malloc(size) custom_malloc(size, __FILE__, __LINE__)