我试图在Solaris操作系统上用C ++ / C编写的非常复杂的遗留系统中查找内存泄漏。我的想法是记录每个malloc和free,然后postproccess日志。
我能够编写一个正确调用的存根malloc和自由函数。问题是他们除了日志之外不做任何其他事情。结果,系统崩溃
我的问题是:它们是一个替代malloc库,可以在solaris上运行,可以从我的stub malloc&免费功能?
答案 0 :(得分:3)
理想情况下,您应该使用一些内存分析工具,但如果没有相同的内容,您可以尝试按计划实施自己的检漏仪。
您可以通过包装器调用malloc
和free
库版本。
以下是您可能尝试实施的方案:
您的包装函数应该实现一种功能,其中malloc
的包装器存储行号,文件名,请求的大小和malloc在链表中返回的地址
如何获取文件名和行号?
提示:使用__FILE__
,__LINE__
free
包装器应该检查发送的地址以便从列表中释放,并从链表中删除该条目。
在程序结束时,您应该打印此链接列表的内容,该列表提供泄漏内存大小,文件名和分配缓冲区的行号。
<强>更新强>
如何在没有无限递归的情况下将程序malloc
调用映射到自己的包装调用?
通过巧妙使用宏!
#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__)
void* my_malloc(size_t size, const char *file, int line, const char *func)
{
void *p = malloc(size);
printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);
/*Link List functionality goes in here*/
return p;
}
答案 1 :(得分:3)
为什么不直接执行libumem的LD_PRELOAD并使用UMEM_DEBUG? umem_debug的联机帮助页应该为您提供更多信息。
答案 2 :(得分:0)
除了libumem之外,我还建议使用包含RTC内存泄漏检测程序的Solaris Studio dbx。