【问题标题】:memory leak in an embedded system嵌入式系统中的内存泄漏
【发布时间】:2013-02-19 10:40:43
【问题描述】:

我需要检查嵌入式系统中的内存泄漏。

IDE 是 HEW,我们使用的是 uCOSIII RTOS。

Valgrind 不支持上述配置。您能否推荐一种检查内存泄漏的工具或方法?

【问题讨论】:

    标签: memory-leaks embedded


    【解决方案1】:

    在嵌入式系统中动态分配内存的第一条规则是“不要”。在执行开始时将其全部分配一次,然后不理会。否则,您必须评估并决定当malloc(或类似操作)失败时该怎么做。

    如果您必须在运行时动态分配内存,那么最简单的方法是,您可以使用日志基础设施来跟踪对malloc/free 的调用,方法是在它们周围编写包装器。然后,您可以跟踪分配和解除分配发生的地点和时间,并希望看到缺少的内容。

    【讨论】:

    • 除了处理失败的 malloc 之外,还必须考虑 malloc 不是确定性操作的事实。换句话说,malloc 所花费的时间可能会从一个调用到下一个调用发生变化,因此可能会导致您错过实时截止日期......
    【解决方案2】:

    我一直在思考这个问题,这里随机尝试一下如何使用嵌入式系统做到这一点: * 首先您需要检查发生在哪个线程泄漏。在进行分配时,您还应该计算每个线程有多少活动分配。如果分配数量在没有释放的情况下不断增长,这是一个可疑的任务 * 其次,您需要计算来自该线程的分配数。为此,请将 alloc 替换为宏。使用宏可以保存文件名和调用所在的行号。

    例如

    #define alloc(x) my_alloc(x, __LINE__, __FILE__)
    
    void * my_alloc(size_t size, int line, char * file)
    {
         // increase number of allocations and dealocations for each combination line/file
    }
    

    同样你需要定义 my_free。

    在此之后,运行程序并打印不断增长的不时分配。这应该有助于发现内存泄漏。

    附:我没有对此进行测试,但我看到有人在我们的代码中做了类似的事情:)

    【讨论】:

      【解决方案3】:

      您的要求并不完全清楚。如果您正在寻找能够在您的环境中找到内存泄漏的“valgrind”工具;这很难找到。

      如果您有一些代码,则可以检查特定应用程序中的所有内存分配和内存释放。作为link1Link2

      还有一些文件可用,通过执行它们你可以发现内存泄漏。

      http://code.axter.com/debugalloc.cpp
      http://code.axter.com/debugalloc.h
      
      http://code.axter.com/debuglogger.cpp
      http://code.axter.com/debuglogger.h
      
      http://code.axter.com/debuglog.c
      http://code.axter.com/debuglog.h
      
      1. debugalloc.* 代码具有跟踪内存泄漏的能力,并且它具有 cmets 中的描述和使用信息。

      2. debuglogger.* 代码有一些代码用于分析您的代码。

      3. debuglog.* 是代码的一些受限 C 版本。

      【讨论】:

        【解决方案4】:

        看看libtalloc,Samba 中使用的核心内存分配器。如果您没有 atexit()stdio.h,它可能无法开箱即用,但将其移植到您的环境应该不需要太多工作。

        查看talloc_enable_leak_report_full()talloc_report_full()(以及其他)以帮助您入门。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-12
          • 1970-01-01
          • 1970-01-01
          • 2020-03-11
          • 1970-01-01
          • 2012-07-27
          • 1970-01-01
          • 2019-05-24
          相关资源
          最近更新 更多