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

我有一个使用C ++使用Visual Studio 2008编写的Windows应用程序。我想要获得有关内存使用情况的统计信息,以查找有关内存使用情况的瓶颈和位置。 理想情况下,我想有一个工具,可以做到这一点,而不必进入并添加计数器/分析逻辑到代码本身。 基本上我正在寻找的是:

  • 所有的分配清单(释放或不是重要的,我想知道每次分配的东西)
  • 每个分配的调用堆栈和一个计数器,代表调用代码和分配内存的次数。
  • 关于什么内存已被释放vs没有释放(查找泄漏)的信息。 理想情况下,它将足够智能,以确定内存是否仍在使用中,或者是否真的已经泄漏(通过示波器或其他智能机制)。

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

  • Rational PurifyPlus :老实说,我一直没有能够使用这个工具。 它返回了很多误报。 另外,它并没有给我在我上面的列表中的前两个项目,而是似乎只关注内存错误和泄漏。
  • Sysinternals VMMap :这个工具很有趣,可以让我看看内存是如何分布的(堆栈vs堆vs共享堆等)。 它也让我看到分配的调用树,但不是很直观或有帮助。 数据很难理解。
  • DevPartner Boundschecker :我真的认为这是迄今为止最无用的工具。 多年以前,我在用DevPartner买下它之前就使用了它,我记得它工作得更好。 但它并不真正给我所需要的统计数据,也不能正确地检测内存泄漏

我提前感谢任何帮助/build议。 我的应用程序是一个服务器,在压力testing过程中随着时间的推移会遭受严重的内存增长问题(并且由于虚拟字节超过了32位应用程序的限制而最终崩溃)。 有合适的工具将帮助我隔离我们正在分配内存,也可能会泄漏内存。

Solutions Collecting From Web of "我可以使用什么工具分析内存使用情况?"

在我的工作地点,我们使用软件验证的 内存验证器 。 它会给你各种内存统计信息,分配列表,每个分配的调用堆栈和内存泄漏。 事实证明,在我的工作经验中偶尔有用。

你可以修改你的代码使用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 

(Ref .: prev。topic )

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

你可以试试Valgrind 。

如果你还没有看到这个,你可以看看这里。 这似乎是最近更新。

Sysinternals套房由Mark Russinovich http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx