我可以使用什么工具来分析内存使用情况?

时间:2012-08-28 20:29:51

标签: c++ windows memory-leaks profiling

我有一个使用C ++使用Visual Studio 2008编写的Windows应用程序。我想获取有关内存使用情况的统计信息,以查找处理内存使用情况的瓶颈和位置。理想情况下,我希望有一个工具可以执行此操作,而无需进入并向代码本身添加计数器/分析逻辑。基本上我正在寻找的是:

  • 所有分配清单(无论是否自由都应该无关紧要,我希望每次分配时都知道)
  • 每个分配的调用堆栈和一个表示调用代码和分配内存的次数的计数器。
  • 有关已释放内存与未释放内存(查找泄漏)的信息。理想情况下,它足够聪明,可以确定内存是否仍在使用中,或者是否确实已泄露(通过范围或其他智能机制)。

我不在乎它是否是免费工具。以下是我已经看过的一些工具:

  • Rational PurifyPlus :老实说,我还没有充分利用这个工具。它会返回很多误报。此外,它没有给我上面列表中的前两项,它似乎只关注内存错误和泄漏。
  • Sysinternals VMMap :这个工具很有趣,让我可以看看内存是如何分散的(堆栈与堆与共享堆等)。它还让我看到分配的调用树,但不是非常直观或有用。从数据中理解很难。
  • DevPartner Boundschecker :我认为这是迄今为止最无用的工具。我在几年前使用它之前,他们被DevPartner收购了,我记得它工作得更好。但它并没有真正给我所需的统计数据,也没有能够正确检测内存泄漏。

我提前感谢任何帮助/建议。我的应用程序是一个服务器,在压力测试期间会遇到严重的内存增长问题(并且最终由于虚拟字节超过32位应用程序的限制而崩溃)。拥有合适的工具将帮助我隔离我们分配内存的位置以及我们可能泄漏内存的位置。

5 个答案:

答案 0 :(得分:1)

您是否可以修改代码以使用mallocreallocfree的调试版本?如果是,请检查_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

(参考:prev. topic

答案 1 :(得分:1)

在我的工作地点,我们使用Software Verification's Memory Validator。它将为您提供各种内存统计信息,分配列表,每个分配的调用堆栈以及内存泄漏。事实证明,这在我的工作经历中偶尔会有用。

答案 2 :(得分:0)

Visual Studio中的CRT内存调试功能有很长的路要走。您想要的额外内容需要记录每个分配。 CRT提供_CrtSetAllocHook就是这种事情。

答案 3 :(得分:-1)

您可以尝试Valgrind

答案 4 :(得分:-1)

如果你还没有看到这个,你可能希望看看这里。它似乎最近更新了。

Sysinternals Suite By Mark Russinovich http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx