我需要一个内存分析器来了解每个函数的内存使用情况。我知道 valgrind(Massif),但它不能提供有关特定函数的信息(至少,我不知道如何在 Massif 中做到这一点)。
您知道在 Linux 上有什么工具可以实现此目的吗?
谢谢!
我需要一个内存分析器来了解每个函数的内存使用情况。我知道 valgrind(Massif),但它不能提供有关特定函数的信息(至少,我不知道如何在 Massif 中做到这一点)。
您知道在 Linux 上有什么工具可以实现此目的吗?
谢谢!
malloc
函数或创建一个新的库,其中包含malloc
调用,并从您的malloc函数
跟踪大小。我不是在谈论实现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);
}
你完全可以修改这段代码来完成一些额外的操作。
Massif
可以显示出程序中内存使用量较高的函数,但前提是程序需要编译时加上调试信息(-g
),它甚至可以显示出函数所在的行号。ms_print
输出的图像下方的每个详细快照中,这些信息会以调用树的形式呈现。可以通过--detailed-freq
选项控制生成详细快照的频率。有关读取详细快照信息的详细信息,请参见Massif手册的9.2.6节。LD_PRELOAD
将其与程序动态链接,并使用HEAPPROFILE
环境变量启用堆剖析器。