4

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

  • 所有分配的列表(释放与否无关紧要,我想知道每次分配的东西)
  • 每个分配的调用堆栈和一个计数器,表示调用代码和分配内存的次数。
  • 有关已释放内存与未释放内存的信息(以查找泄漏)。理想情况下,它应该足够智能来确定内存是否仍在使用中,或者它是否真的已经泄漏(通过范围或其他一些智能机制)。

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

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

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

4

5 回答 5

2

您能否修改您的代码以使用 和 的调试malloc版本?如果是,请检查和。reallocfree_malloc_dbg_realloc_dbg_free_dbg

(您可以根据这些函数编写自己的new和运算符。)delete

#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

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

Sysinternals 套件,作者 Mark Russinovich http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx

于 2012-08-28T20:42:01.850 回答