我如何计算哪个函数请求的字节数是多少?

时间:2013-12-03 19:57:57

标签: c++ linux

我在C ++中有一个复杂的代码库。我运行了一个内存分析器,它计算malloc分配的字节数,这给了我X字节。从理论上讲,我的代码应该返回X-Y字节(Y随输入而变化,范围从几KB到几GB,所以这是不可忽略的。)

我需要找出我的代码的哪一部分要求额外的字节。我尝试了一些工具,但无济于事:massifperf,我甚至尝试gdb打破malloc()。我可能会为malloc写一个包装器,要求提供调用函数,但我不知道该怎么做。

有没有人知道如何找到程序不同部分要求的内存量?

2 个答案:

答案 0 :(得分:2)

如果你使用自定义分配函数 - malloc的包装器 - 你可以使用gcc backtrace函数(http://man7.org/linux/man-pages/man3/backtrace.3.html)来找出哪些函数用什么参数调用malloc。

那将告诉你正在分配的功能。从那里你可以手动将biggies分类到域中。

这个问题有很好的信息包装本身。 Create a wrapper function for malloc and free in C

<强>更新 这不会捕获新的/删除分配,但覆盖它们比malloc更容易!请参阅此处:How to properly replace global new & delete operators +关于最佳答案的非常重要的评论“别忘了其他3个版本:new [],删除[],nothrow”

答案 1 :(得分:0)

您可以创建一个调用libc malloc的宏并打印分配的详细信息。

#define malloc( sz ) (\
{\
    printf( "Allocating %d Bytes, File %s:%d\n", sz, __FILE__, __LINE__ );\
    void *(*libc_malloc)(size_t) = dlsym(RTLD_NEXT, "malloc");\
    printf("malloc\n");\
    void* mem = libc_malloc(sz);\
    mem; // GCC-specific statement-expression \
}

这应该(触摸木头)被调用来代替真正的malloc并吐出分配的字节数和分配发生的位置。像这样返回 mem 虽然是GCC特有的。