我如何跟踪内存分配?

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

这里是关于我的环境的细节

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

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

  1. 不知道如果创build我自己的malloc将有所帮助。 如果这是可能的,有人可以解释一下吗?
  2. 不能使用像walgrind这样的工具,不适用于这种架构。
  3. 代码库是巨大的,不完全理解,因此审查是不可行和快速的。
  4. strace给了我分配的内存地址,但是我怎样才能弄清楚这个代码呢?

请build议是否有一些方法去做这件事。

非常感谢。

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

干杯,帕文

如果你想通过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从列表中删除相关条目。 该方案结束时列在名单上的还有地点泄漏的记忆。

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