我想写一个"简单的"内存泄漏检查器。
为了做到这一点,我需要计算程序中malloc()
ed内存块的数量,但问题是我不想修改它的源代码。
换句话说,我想实现以下接口:
memory_check <executable name>
我不能访问可执行文件的源文件
首先,我应该尝试拦截一个系统调用。但是我读到"所以malloc不调用任何系统调用?",这似乎不是一个想法,也因为它会极其缓慢的所有系统(我可以假设)。
是否有其他选项拦截malloc()
呼叫?
如果你愿意改变你的接口为LD_PRELOAD=mymalloc.so <executable>
,你可以这样做:
- 创建一个共享库
- 使用
dlsym
获取malloc
的句柄 - 显示外部
void *malloc(size_t size)
- 通过上面获得的句柄调用真正的
malloc
,并且还存储您的调试信息
:
- 调用程序
- 程序自动调用您的"被劫持";
malloc
版本
LD_PRELOAD=mymalloc.so ./program
编辑
如果你不想改变你的接口,但想使用这个技巧,你可以做一个包装程序fork(2)
s,设置LD_PRELOAD
,然后使用它的名字执行你的真正的程序。
如果可执行文件是动态链接的,那么您可以编写自己的malloc,并将其构建到。so中,在您自己的malloc中,您可以简单地增加计数器:
#ifdef malloc
#undef malloc
#endif
static int count;
void *malloc(size_t size)
{
count++;
return _malloc(size);
}