【问题标题】:How to find memory leaks in a task in RTOS?如何在 RTOS 中的任务中查找内存泄漏?
【发布时间】:2018-02-22 12:33:55
【问题描述】:

我在 RTOS 中有一个任务,在任务内部我分配了 5 次内存并释放了 3 次内存,但是如何在不使用外部工具的情况下找到内存泄漏?

【问题讨论】:

  • 如果您有打印 - 尝试在分配后立即打印分配的指针(在每个分配操作上) - 并在每个 free 命令之前打印指针。比较 malloc 和 free 的结果,通过一些打印,您也许可以了解它们未释放的流程
  • @Dagan 如果任务有很多分配和取消分配,打印消息很容易找到吗?
  • 如果任务无限期运行,则无法检测到“泄漏”,因为无法自动确定任何特定分配在某些时候不会被释放。对于终止的任务,可以确定并非所有分配的内存都在终止时被释放,但任务通常不会以这种方式运行。
  • 在 RTOS 系统上使用动态内存分配表明程序设计从根本上很糟糕。它不是个人电脑。所以泄漏是你的问题中最少的。通过编写一个有意义的程序来解决这个问题:使用堆栈或内存池等。
  • 我完全同意伦丁的观点。这正是为什么有经验的嵌入式人员像瘟疫一样避免 malloc 和 free(或 new 和 delete)。它通常在嵌入式编码标准中被禁止。如果你想让某些东西在它所在的范围之外继续存在,请使用一个在启动时放置在堆上的全局变量,并且只有一次,或者构建你自己的迷你内存管理系统——一个数组,每个变量都有一个使用中的标志元素。

标签: c embedded rtos


【解决方案1】:

我不认为 FreeRTOS 维护分配的任务所有权(在随机本地工作目录中快速阅读 heap_2.c 支持这一点),所以这听起来不可能。

可能有钩子可以让您自行添加,请参阅 traceMALLOC()traceFREE() 宏。

【讨论】:

  • 你的答案看起来不错,但是使用 traceMALLOC() 和 traceFREE() 是一些额外的任务,它需要额外的内存和 CPU 来处理,对吗?还有其他方法吗?
  • 如果不增加至少额外的任务时间,您将无法衡量正在发生的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 2016-06-18
  • 2018-01-12
  • 1970-01-01
相关资源
最近更新 更多