我有一个非常独特的问题,我在一个特殊的硬件上运行Linux,这是一个基于Octeon的硬件。我看到我的进程在执行特定操作时不断分配内存。我想跟踪代码的哪一部分正在进行此调用。
以下是有关我的环境的详细信息
然而,这是我需要解决的选项/限制。
请建议是否有办法解决这个问题。
非常感谢。
另一件我忘了提到的事情是,进程的虚拟内存继续增加到1.4GB,然后停止,我看到代码中的alloc会因ENOMEM而失败。这个1.4 GB的限制是否与32位机器有关? AFAIU 32位机器应该允许每个进程3 GB的虚拟内存不是吗?此外,没有每个进程限制,我已经使用setrlimit / getrlimit确认了这一点。
干杯, 帕
答案 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少得多的架构依赖。