4

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

这是有关我的环境的详细信息

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

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

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

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

非常感谢。

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

干杯,帕万

4

2 回答 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。程序末尾的列表中剩下的内容是带有位置的内存泄漏。

于 2012-06-06T18:29:38.037 回答
0

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

于 2012-06-06T18:26:58.073 回答