我如何跟踪内存分配?

时间:2012-06-06 18:22:44

标签: c linux debugging memory-leaks mmap

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

以下是有关我的环境的详细信息

  1. Octeon MIPS架构32位。
  2. Linux内核2.6
  3. 最小的linux实现。
  4. 然而,这是我需要解决的选项/限制。

    1. 不确定创建自己的malloc是否有帮助。如果有可能,有人可以解释一下吗?
    2. 无法使用像walgrind这样的工具,不适用于此架构。
    3. 代码库很大,不完全理解,因此审查不可行且快速。
    4. strace给了我分配的内存地址,但是我怎样才能找出创建它的代码?
    5. 请建议是否有办法解决这个问题。

      非常感谢。

      另一件我忘了提到的事情是,进程的虚拟内存继续增加到1.4GB,然后停止,我看到代码中的alloc会因ENOMEM而失败。这个1.4 GB的限制是否与32位机器有关? AFAIU 32位机器应该允许每个进程3 GB的虚拟内存不是吗?此外,没有每个进程限制,我已经使用setrlimit / getrlimit确认了这一点。

      干杯, 帕

2 个答案:

答案 0 :(得分: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中的列表中删除相关条目。程序结束时列表中剩下的内容是使用位置泄漏内存。

答案 1 :(得分:0)

您可能需要查看Dmalloc。应该比valgrind少得多的架构依赖。