【发布时间】:2012-06-10 19:18:43
【问题描述】:
我有一个非常独特的问题,我在一个特殊的硬件上运行 Linux,这是一个基于 Octeon 的硬件。我看到我的进程在执行特定操作时不断分配内存。我想跟踪代码的哪一部分进行了这个调用。
这是关于我的环境的详细信息
- Octeon MIPS 架构 32 位。
- Linux 内核 2.6
- 最小的 linux 实现。
但是,这是我需要解决的选项/限制。
- 不确定创建自己的 malloc 是否会有所帮助。如果可能,有人可以解释一下吗?
- 无法使用 walgrind 等工具,不适用于此架构。
- 代码库很大,没有完全理解,因此审查不可行和快速。
- strace 给了我分配的内存地址,但我怎样才能找出创建这个的代码呢?
请建议是否有办法解决这个问题。
非常感谢。
我忘了提到的另一件事,进程的虚拟内存继续增加到 1.4GB,此时它停止了,我看到代码中的分配因 ENOMEM 而失败。这个 1.4 GB 的限制与 32 位机器有关吗? AFAIU 32 位机器应该允许每个进程 3 GB 的虚拟内存不是吗?此外,没有每个进程的限制,我已经用 setrlimit/getrlimit 确认了这一点。
干杯, 帕万
【问题讨论】:
-
代码是否为 x86 编译?然后你可以在那里使用 valgrind 并至少捕获非平台特定的泄漏。
-
感谢您的回复 Torp,代码确实可以为 x86 编译,但这在 x86 平台上无法重现。只有在 Octeon 上,我才能看到 strace 弹出大量 mmap2 调用,表明发生了一些内存分配。当我在 x86 上运行相同的用例时,我根本看不到 mmap2 调用。
标签: c linux debugging memory-leaks mmap