计算从外部程序使用malloc()分配的块

时间:2013-03-03 07:44:01

标签: c linux malloc

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

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

换句话说,我想实现以下界面:

memory_check <executable name>

我无法访问可执行文件的来源。

首先我应该尝试拦截系统调用。但是我读了“So malloc doesn't invoke any syscall?”并且它似乎不是一个想法,也因为它会极大地减慢所有系统(我可以想象)。

是否还有其他选项可以拦截malloc()来电?

2 个答案:

答案 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。