我有一个使用C ++使用Visual Studio 2008编写的Windows应用程序。我想获取有关内存使用情况的统计信息,以查找处理内存使用情况的瓶颈和位置。理想情况下,我希望有一个工具可以执行此操作,而无需进入并向代码本身添加计数器/分析逻辑。基本上我正在寻找的是:
我不在乎它是否是免费工具。以下是我已经看过的一些工具:
我提前感谢任何帮助/建议。我的应用程序是一个服务器,在压力测试期间会遇到严重的内存增长问题(并且最终由于虚拟字节超过32位应用程序的限制而崩溃)。拥有合适的工具将帮助我隔离我们分配内存的位置以及我们可能泄漏内存的位置。
答案 0 :(得分:1)
您是否可以修改代码以使用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
(参考: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