4

Visual Studio 2008 を使用して C++ を使用して作成された Windows アプリケーションがあります。メモリ使用量に関する統計を取得して、メモリ使用量に関するボトルネックと場所を見つけたいと考えています。理想的には、コード自体にカウンター/プロファイリング ロジックを追加することなく、これを行うツールが必要です。基本的に私が探しているのは次のとおりです。

  • すべての割り当てのリスト (解放されたかどうかは関係ありません。何かが割り当てられるたびに知りたいです)
  • 各割り当てのコールスタックと、コードが呼び出されてメモリが割り当てられた回数を表すカウンター。
  • 解放されたメモリと解放されていないメモリに関する情報 (リークを見つけるため)。理想的には、メモリがまだ使用されているかどうか、またはメモリが実際にリークしたかどうか (スコープまたはその他のインテリジェントなメカニズムを介して) を判断するのに十分なほどインテリジェントです。

無料のツールかどうかは気にしません。ここに私がすでに見たいくつかのツールがあります:

  • Rational PurifyPlus : 正直なところ、私はこのツールをあまり活用できていません。多くの誤検知を返します。また、上記のリストの最初の 2 つの項目は表示されず、代わりにメモリ エラーとリークのみに焦点が当てられているようです。
  • Sysinternals VMMap : このツールは興味深いもので、メモリがどのように分散されているかを確認できます (スタック、ヒープ、共有ヒープなど)。また、割り当てのコール ツリーも表示されますが、あまり直感的ではなく、役に立ちません。データから意味を理解するのは難しい。
  • DevPartner Boundschecker : これまでで最も役に立たないツールだと思います。何年も前に DevPartner に買収される前に使用していましたが、以前よりもずっとうまく機能していたことを覚えています。しかし、実際には必要な統計データが得られるわけではなく、メモリ リークを適切に検出できるようにも見えません。

事前にヘルプ/アドバイスをいただければ幸いです。私のアプリケーションはサーバーであり、ストレス テスト中に時間の経過とともに深刻なメモリ増加の問題に悩まされます (そして、最終的には 32 ビット アプリケーションの制限を超える仮想バイトが原因でクラッシュします)。適切なツールを使用すると、メモリを割り当てている場所とメモリ リークの可能性がある場所を特定するのに役立ちます。

4

5 に答える 5

2

mallocreallocおよびのデバッグバージョンを使用するようにコードを変更できますfreeか?_malloc_dbgはいの場合は、、、_realloc_dbgおよびをチェックし_free_dbgます。

(これらの関数に基づいて、独自の演算子と演算子を記述できます。newdelete

#ifdef _DEBUG
# define _CRTDBG_MAP_ALLOC 1
# include <Crtdbg.h>
# define malloc(size)       _malloc_dbg(size,_CLIENT_BLOCK,__FILE__,__LINE__)
# define realloc(addr,size) _realloc_dbg(addr,size,_CLIENT_BLOCK,__FILE__,__LINE__)
# define free(addr)         _free_dbg(addr,_CLIENT_BLOCK)
void * operator new ( size_t size, const char * filename, int linenumber )
{
  void * addr = _malloc_dbg( size, _CLIENT_BLOCK, filename, linenumber );
  if ( addr == 0 )
    throw std::bad_alloc;
  return addr;
}
void * operator new ( size_t size, const std::nothrow_t &no_throw, const char * filename, int linenumber )
{
  return _malloc_dbg( size, _CLIENT_BLOCK, filename, linenumber );
}
void * operator new [] ( size_t size, const char * filename, int linenumber )
{
  void * addr = _malloc_dbg( size, _CLIENT_BLOCK, filename, linenumber );
  if ( addr == 0 )
    throw std::bad_alloc;
  return addr;
}
void * operator new [] ( size_t size, const std::nothrow_t &no_throw, const char * filename, int linenumber )
{
  return _malloc_dbg( size, _CLIENT_BLOCK, filename, linenumber );
}
void operator delete( void *p, const char * filename, int linenumber )
{
  _free_dbg(p,_CLIENT_BLOCK);
}
void operator delete [] ( void *p, const char * filename, int linenumber )
{
  _free_dbg(p,_CLIENT_BLOCK);
}
# define DEBUG_NEW_HEAP new( __FILE__, __LINE__ )
# define new DEBUG_NEW_HEAP
#endif

(参照:前のトピック

于 2012-08-28T21:08:55.490 に答える
2

私の職場では、Software Verification の Memory Validatorを使用しています。さまざまなメモリ統計、割り当てのリスト、各割り当てのコール スタック、およびメモリ リークが表示されます。それは、私の仕事の経験で時々役立つことが証明されています.

于 2012-08-28T21:55:29.137 に答える
0

Visual Studio の CRT メモリ デバッグ機能は大いに役立ちます。必要な余分なものは、各割り当てをログに記録する必要があります。CRT は、まさにこのようなことのために_CrtSetAllocHookを提供しています。

于 2012-08-28T21:13:37.527 に答える
-1

Valgrindを試すことができます。

于 2012-08-28T20:33:21.140 に答える
-1

これをまだ見ていない場合は、ここを見たいと思うかもしれません。かなり最近更新されたようです。

Mark Russinovich による Sysinternals スイート http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx

于 2012-08-28T20:42:01.850 に答える