5

我想写一个“简单”的内存泄漏检查器。

为了做到这一点,我需要计算malloc()程序中的 ed 内存块的数量,但我不想修改它的来源的问题。

换句话说,我想实现以下接口:

memory_check <executable name>

我无权访问可执行文件的源代码。

首先,我应该尝试拦截系统调用。但我读到“所以 malloc 不调用任何系统调用? ”这似乎不是一个想法,也因为它会极大地减慢所有系统(我可以假设)。

是否有任何其他选项可以拦截malloc()呼叫?

4

2 回答 2

5

如果你愿意改变你的界面,LD_PRELOAD=mymalloc.so <executable>你可以这样做:

  • 创建一个共享库
    • 获取使用malloc句柄dlsym
    • 暴露外部void *malloc(size_t size)
    • 通过上面获得的句柄调用真实malloc的,并存储你的调试信息

然后:

  • 调用程序LD_PRELOAD=mymalloc.so ./program
  • 该程序会自动调用您的“劫持”版本malloc

编辑

如果您不想更改界面但想使用此技巧,您可以制作一个包装程序,使用其名称fork(2)设置LD_PRELOAD并执行您的真实程序。

于 2013-03-03T07:51:14.390 回答
0

如果可执行文件是动态链接的,那么您可以编写自己的 malloc,并将其构建为 .so,在您自己的 malloc 中,您可以简单地增加一个计数器:

#ifdef malloc
#undef malloc
#endif

static int count;
void *malloc(size_t size)
{
    count++;
    return _malloc(size);
}

然后使用 LD_PRELOAD 来预加载你自己的 malloc 。

于 2013-03-03T07:56:00.233 回答