1

すべての C コードを含む MS-Visual Studio 2005 ワークスペースがあります。このアプリケーション (exe) は、malloc と realloc を使用してヒープから動的にメモリを割り当てます。特定のテスト ケースを実行するときに、このアプリケーション プログラムで malloc/realloc を使用してヒープに割り当てられた最大サイズを計算したいと考えています。

malloc のサイズを確認して累積することでコードを変更したくありません。理由は次のとおりです。

a) 1KB の一部のメモリが malloc されてから解放され、次に 2KB のメモリが malloc されるというシナリオが考えられます。したがって、最大値は 2KB であり、1+2=3KB ではなく値として取得する必要があります。

したがって、このコードですべての malloc/free が発生している場所を実際に確認し、これにコードを追加する必要がありますが、これは避けたいと考えています。

1)malloc/reallocを使用して動的に割り当てられた最大または合計メモリのサイズを見つけるためのツール(フリーウェア/ライセンス付き)はありますか?

2)MS Visual Studio 2005/2008 自体はこのようなものを提供していますか?

ありがとう、

-広告

4

4 に答える 4

1

CRT と静的にリンクする場合、malloc、realloc、free の実装を「覆す」ことができます (実際には、CRT の malloc.c、realloc、c free.c、および/または dbgheap.c に表示されるすべての関数)。 . 実行可能ですが、却下する必要がある関数の完全なセットを取得する前に、いくつかの反復が必要になる場合があります。

CRT と動的にリンクする場合、次のように malloc、realloc、および free を再定義できます。

#define malloc(s)    mymalloc(s)
#define realloc(p,s) myrealloc(p,s)
#define free(p)      myfree(p)

mymalloc、myrealloc、および myfree の実装では、単純に malloc、realloc、および free を使用できます (mymalloc を実装するソース ファイルで #define を使用しないでください...)。または、ネイティブの Windows 関数を使用することもできます。

于 2010-03-03T22:10:38.177 に答える
0

私は次のことをお勧めします:

  1. 分析したいソースコードにアクセスできる場合は、すべてのmalloc/realloc呼び出しを、分析を実行する独自の関数の呼び出しに置き換えます。
  2. ソースコードにアクセスできない場合は、MicrosoftのDetoursライブラリを使用できます。ライブラリは、任意の関数への呼び出しをインターセプトし、それらをカスタムメイドの実装にリダイレクトします。この実装では、分析を実行してから、標準にフォールバックできますmalloc/realloc
于 2010-03-03T18:09:45.793 に答える
0

VSには、などのヒープデバッグツールが多数あります。これらのツールを使用_heapwalkすると、ヒープをウォークスルーして、ヒープ上のブロックに関する情報を取得できます。あなたがする必要があることのほとんどはあなたのヒープが最大使用量にあるときを理解することです、それであなたはそれをいつ歩きそしてそのサイズを見つけるべきかを知っています。

于 2010-03-03T18:29:53.040 に答える
0

メモリバリデーターはこれを行うことができます。

役立つと思われるいくつかの異なるレポートがあります。

  • 累計。これはダイアログボックスとして表示され、各メインメモリアロケータ(Cランタイム、HeapAlloc、LocalAlloc、GlobalAlloc、CoTaskMemAllocなど)の現在の値、累積値、および合計値を提供します。

  • オブジェクト。これはメインタブの1つであり、オブジェクトタイプ、サイズ、カウント、累積を表示します。また、スレッドごとおよびdllごとの値のサブタブ。

  • サイズ。これはメインタブの1つであり、サイズ、カウント、累積が表示されます。また、スレッドごとおよびdllごとの値のサブタブ。

  • バーチャル。これにより、メモリのグラフィカルビュー(1ピクセル== 1ページのメモリ)が表示され、仮想メモリページと仮想メモリ段落の詳細な仮想メモリデータを示すサブタブがあります。

完全な開示:私はMemoryValidatorチームの一員です。

于 2010-03-10T18:43:09.993 に答える