【问题标题】:How can i track memory allocation?如何跟踪内存分配?
【发布时间】:2012-06-10 19:18:43
【问题描述】:

我有一个非常独特的问题,我在一个特殊的硬件上运行 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 确认了这一点。

干杯, 帕万

【问题讨论】:

  • 代码是否为 x86 编译?然后你可以在那里使用 valgrind 并至少捕获非平台特定的泄漏。
  • 感谢您的回复 Torp,代码确实可以为 x86 编译,但这在 x86 平台上无法重现。只有在 Octeon 上,我才能看到 strace 弹出大量 mmap2 调用,表明发生了一些内存分配。当我在 x86 上运行相同的用例时,我根本看不到 mmap2 调用。

标签: c linux debugging memory-leaks mmap


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果你想在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 中的列表中删除相关条目。程序末尾的列表中剩下的内容是内存泄漏和位置。

    【讨论】:

    • 似乎是个好主意,我会试试这个并恢复我的发现。
    • 希望 printf 不会进行任何 malloc 调用,否则这将成为递归地狱 :)
    • @PavanMysore:它不需要,在你的情况下你不需要printf反正:)
    • 太棒了!感谢十亿,无论我多么愚蠢,都没有想到这种方法。我仍然有一个挑战,我应该确保这个 my_malloc 应该被使用的所有链接,我需要检查我如何使这个宏全局可见,并掩盖实际的 malloc。
    • 顺便说一句,您可能希望在调用原始malloc 之后定义宏(在void *p = malloc(size); 行中)
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多