如何跟踪内存分配?

4
我有一个非常独特的问题,我在一台基于Octeon的特殊硬件上运行Linux。我发现我的进程在执行特定操作时不断分配内存。我想追踪哪部分代码正在进行此调用。
以下是有关我的环境的详细信息:
  1. Octeon MIPS架构32位。
  2. Linux内核2.6
  3. 最小化的Linux实现。
但是这里有我需要解决的选项/限制:
  1. 不确定是否创建自己的malloc会有所帮助。如果可能的话,有人能解释一下吗?
  2. 无法使用像walgrind这样的工具,因为它不适用于此体系结构。
  3. 代码库很大,我不太理解它,因此不能快速进行审核。
  4. strace给出了已分配的内存地址,但我如何从中找出创建这个内存的代码?
请建议有没有任何方法可以解决这个问题。
还有一件事我忘了提,在达到1.4GB时,该进程的虚拟内存不断增加,然后停止,并且我看到代码中的分配失败并显示ENOMEM。这个1.4 GB的限制与32位机器有关吗?据我所知,32位机器每个进程应允许3 GB的虚拟内存,不是吗?另外,没有每个进程限制,我已经通过setrlimit/getrlimit确认了这一点。
谢谢。 Pavan

代码是否能在x86上编译通过?如果可以,那么你可以在那里使用valgrind,并至少捕获非平台特定的泄漏。 - Torp
感谢您的回复Torp,代码可以在x86上编译,但在x86平台上无法重现。只有在Octeon上,我才能看到strace弹出大量的mmap2调用,表明正在进行某些内存分配。当我在x86上运行相同的用例时,根本看不到mmap2调用。 - PavanMysore
2个回答

5
如果你想在malloc上编写一个包装函数,你可以使用简单的宏技巧来实现,而不必修改代码中每个调用该函数的实例。
void* my_malloc(size_t size, const char *file, int line, const char *func);

#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__)

void* my_malloc(size_t size, const char *file, int line, const char *func)
{

    void *p = malloc(size);
    printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);

    /*Link List functionality goes in here*/

    return p;
}

同样地,您也可以将free映射到调用自己的函数。
您可以维护一个已分配地址列表,在malloc中不断添加新条目,并在free中删除相关条目。程序结束时列表中剩余的内容是存在泄漏内存的位置。

看起来是个不错的想法,我会尝试一下并回复我的发现。 - PavanMysore
希望 printf 不会调用任何 malloc,否则这将变成一个递归地狱 :) - PavanMysore
抱歉如果这很愚蠢,但这是否适用于我的程序链接的库函数?我怀疑在我链接的动态库的情况下它不会起作用。有什么办法可以解决这些情况吗? - PavanMysore
1
顺便提一下,您可能希望在调用原始的 malloc(在行 void *p = malloc(size); 中)之后定义宏。 - fuz
有什么想法可以解决这些情况吗 :( - PavanMysore
显示剩余3条评论

0

你可能想看看Dmalloc。它应该比valgrind更少依赖于架构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接