我使用C ++使用Visual Studio 2008年。我想获得内存使用统计发现瓶颈和位置上的内存使用工作在Windows应用程序写入。 理想情况下,我想有一个工具,做到这一点,而不必去并添加计数器/剖析逻辑代码本身。 基本上我正在寻找的是:
- 所有的分配名单(释放与否并不重要,我想知道的东西每次分配时间)
- 每个分配的调用堆栈和表示的时间代码被称为和存储器被分配的数目的计数器。
- 什么记忆信息已经释放VS不会释放(找到泄漏)。 理想情况下是足够的智能来确定内存是否还在使用或者如果它真的已经泄漏(通过范围,或其他一些智能的机制)。
我不在乎,如果它是一个免费的工具或没有。 这里有一些工具,我已经看过:
- 理性PurifyPlus的 :老实说,我一直没能取得多大使用这个工具。 它返回大量误报。 此外,它并没有给我在我的列表中的第2项以上,而不是它似乎只专注于内存错误和泄漏。
- 的Sysinternals的VMMap:这个工具很有趣,让我看到内存是如何传播出去(堆栈VS堆VS共享堆等)。 这也让我看到分配的调用树,但也不是很直观的还是很有帮助的。 很难弄明白的数据。
- DevPartner的BoundsChecker:我真的认为这是最无用的工具为止。 我几年前使用它们得到了由DevPartner买之前,我记得它的工作好了很多。 但它并没有真正给我的统计数据,我需要,也不会似乎能够正确地检测内存泄漏。
我提前感谢所有帮助/建议。 我的应用程序是一个服务器,并随着时间的推移压力测试期间(由于虚拟字节超过了32位应用程序的限制,并最终崩溃)遭受严重的内存增长的问题。 有正确的工具将帮助我隔离,我们正在分配内存,并在那里我们可能泄露内存。
在我的工作地点,我们用软件验证的 内存验证 。 它会给你不同的内存统计,分配列表,调用每个分配的堆栈和内存泄漏。 它已被证明是在我的工作经历偶尔有用。
您可以修改代码以使用调试版本malloc
, realloc
和free
? 如果是,检查_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
(参考: 上一个。话题 )
在Visual Studio中的CRT内存调试功能很长的路要走。 你想多余的东西需要记录每一个分配。 在CRT提供_CrtSetAllocHook只是这种事情。
如果你还没有看到这已经你不妨看看这里。 它似乎已经相当最近更新。
的Sysinternals Suite通过标记Russinovich http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx