我想写一个“简单”的内存泄漏检查器。
为了做到这一点,我需要计算malloc()
程序中的 ed 内存块的数量,但我不想修改它的来源的问题。
换句话说,我想实现以下接口:
memory_check <executable name>
我无权访问可执行文件的源代码。
首先,我应该尝试拦截系统调用。但我读到“所以 malloc 不调用任何系统调用? ”这似乎不是一个想法,也因为它会极大地减慢所有系统(我可以假设)。
是否有任何其他选项可以拦截malloc()
呼叫?
我想写一个“简单”的内存泄漏检查器。
为了做到这一点,我需要计算malloc()
程序中的 ed 内存块的数量,但我不想修改它的来源的问题。
换句话说,我想实现以下接口:
memory_check <executable name>
我无权访问可执行文件的源代码。
首先,我应该尝试拦截系统调用。但我读到“所以 malloc 不调用任何系统调用? ”这似乎不是一个想法,也因为它会极大地减慢所有系统(我可以假设)。
是否有任何其他选项可以拦截malloc()
呼叫?
如果你愿意改变你的界面,LD_PRELOAD=mymalloc.so <executable>
你可以这样做:
malloc
句柄dlsym
void *malloc(size_t size)
malloc
的,并存储你的调试信息然后:
LD_PRELOAD=mymalloc.so ./program
malloc
如果您不想更改界面但想使用此技巧,您可以制作一个包装程序,使用其名称fork(2)
设置LD_PRELOAD
并执行您的真实程序。
如果可执行文件是动态链接的,那么您可以编写自己的 malloc,并将其构建为 .so,在您自己的 malloc 中,您可以简单地增加一个计数器:
#ifdef malloc
#undef malloc
#endif
static int count;
void *malloc(size_t size)
{
count++;
return _malloc(size);
}
然后使用 LD_PRELOAD 来预加载你自己的 malloc 。