2012-06-06 44 views
4

我有一个非常独特的问题,我在一个基于Octeon硬件的特殊硬件上运行Linux。我看到我的进程在执行特定操作时会一直分配内存。我想跟踪哪部分代码正在进行此调用。我如何跟踪内存分配?

这里是我的环境

  1. 的Octeon MIPS架构32位的细节。
  2. Linux内核2.6
  3. 最小的Linux实现。

但是,这是我需要解决的选项/限制。

  1. 不知道是否创建我自己的malloc会有所帮助。如果这是可能的,有人可以解释一下吗?
  2. 不能使用像walgrind这样的工具,不适用于此体系结构。代码库非常庞大,完全不了解它,因此复查并不可行和快速。
  3. strace给了我分配的内存地址,但我怎么才能找出创建它的代码?

请建议是否有办法解决这个问题。

非常感谢。

另外一件我忘记提到的,该进程的虚拟内存增加到1.4GB,在此之后,它停止,并且我看到代码中的分配失败,并带有ENOMEM。这是1.4 GB的限制与32位机器有关吗? AFAIU 32位机器应该允许每个进程3 GB的虚拟内存不是吗?此外,没有每个进程的限制,我已经用setrlimit/getrlimit证实了这一点。

干杯, 帕

+0

该代码是否为x86编译?然后你可以在那里使用valgrind并至少捕获非平台特定的泄漏。 – Torp

+0

感谢您的回复Torp,代码确实针对x86进行编译,但是这不能在x86平台上重现。只有在Octeon上,我可以看到strace弹出很多大量的mmap2调用,指示发生了一些内存分配。当我在x86上运行相同的用例时,我根本看不到mmap2调用。 – PavanMysore

回答

0

你可能想看看Dmalloc。应该比valgrind少得多的架构依赖。

+0

谢谢你会检查出来。 – PavanMysore

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的列表中删除相关条目。该计划结束时列表中的内容仍然与地点一起泄漏内存。

+0

似乎是一个好主意,我会试试这个,并恢复我的发现。 – PavanMysore

+0

希望printf不会做任何malloc调用,如果不是这将成为递归地狱:) – PavanMysore

+0

@PavanMysore:它不会和你的情况下,你不需要'printf' :) –