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