我试图在Solaris操作系统上用c++/C编写的一个非常复杂的遗留系统中找到内存泄漏。这个想法是记录每个malloc和free,然后对日志进行后处理。
我可以写一个存根malloc和自由函数被正确调用。问题是它们除了日志什么都不做。结果导致系统崩溃
我的问题是:它们是在solaris上工作的malloc库的替代品,它可以从我的存根malloc&免费的功能?
为什么不直接做libumem的LD_PRELOAD并使用UMEM_DEBUG呢?umem_debug的手册应该会给你更多的信息。
理想情况下,您应该有一些内存分析工具,但是如果没有这些工具,您可以尝试按照您的计划实现自己的泄漏检测器。
您可以通过包装器调用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;
}
除了libumem,我还推荐使用Solaris Studio dbx,它包含一个内存泄漏检测器RTC。