我如何跟踪内存分配?

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

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

> Octeon MIPS架构32位.
> Linux内核2.6
>最小的linux实现.

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

>不确定创建我自己的malloc是否有帮助.如果有可能,有人可以解释一下吗?
>不能使用像walgrind这样的工具,不适用于这种架构.
>代码库是巨大的,不完全理解它,因此审查是不可行和快速的.
> strace给我分配的内存地址,但是我怎样才能找出创建它的代码?

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

非常感谢.

另一件事我忘了提到,进程的虚拟内存继续增加到1.4GB,然后停止,我看到代码中的alloc会因ENOMEM而失败.这个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;
}

同样,您也可以免费地映射您自己的功能.

您可以维护已分配地址的列表,并继续在malloc中添加新条目,并从列表中删除相关条目.程序结束时列表中剩下的内容是泄漏内存和位置.

上一篇:c – 为什么在此示例中remap_file_pages()失败?


下一篇:如何在Linux系统上使用mmap()进行读写