C的内存分析器

时间:2011-01-04 11:43:21

标签: c memory profiler valgrind

我需要一个内存分析器来了解每个函数的内存使用情况。我知道valgrind(Massif),但它没有给我关于特定功能的信息(至少,我不知道如何使用massif)

你知道在Linux中用于此目的的任何工具吗?

谢谢!

4 个答案:

答案 0 :(得分:5)

您可能需要查看MemProf

答案 1 :(得分:5)

如果您只想获取请求大量内存的位置,最简单的方法是修补malloc功能或创建一个具有malloc调用的新库并跟踪大小形式你的malloc function。我不是在谈论实现malloc调用。 LD_PRELOAD这个库给你的应用程序。

这是一个示例代码:

/*
 * gcc -shared -fPIC foo.c -ldl -Wl,-init,init_lib -o libfoo.so
 *
 * LD_PRELOAD this library in the environment of the target executable
 *
 */

#include <stdio.h>
#include <sys/time.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <sys/errno.h>

#ifndef RTLD_NEXT
#define RTLD_NEXT ((void *)-1)
#endif

int init_lib(void)
{
    return 0;
}

void *malloc(size_t size)
{
    /* do required checks on size here */

    return ((void* (*)(size_t))(dlsym(RTLD_NEXT, "malloc")))(size);
}

您可以很好地修改此代码以执行其他操作。

答案 2 :(得分:3)

只要您使用调试信息(Massif)编译了程序,

-g 显示哪些函数负责内存使用。它甚至会显示行号。

此信息在ms_print输出图表下的每个详细快照中作为调用树提供。可以使用massif的--detailed-freq选项控制详细快照的频率。有关阅读详细快照信息的详细信息,请参阅Section 9.2.6 of the Massif manual

答案 3 :(得分:2)

正如其他人所指出的,Massif提供了详尽的分析信息,但它大大减缓了这一过程。

另一种选择是Google的tcmalloc,它有一个嵌入式堆分析器,可以使用分配转储调用图(参见http://goog-perftools.sourceforge.net/doc/heap_profiler.html),也可以用图形方式显示。

您可以在运行时将其与程序LD_PRELOAD链接,HEAPPROFILE env变量启用堆分析器。

相关问题