【问题标题】:How to check for memory leaks in a C application on ARM Architecture如何在 ARM 架构上的 C 应用程序中检查内存泄漏
【发布时间】:2012-01-01 04:32:07
【问题描述】:

我正在为使用 ARM 架构的设备编写 C 代码。我想检查我的应用程序中的内存泄漏。在我工作的设备(ARM 架构)中不支持 Valgrind .. 所以我可以使用哪些其他选项来检查我的应用程序中的内存泄漏。有什么方法可以检查内存泄漏......或者请指导我在编写代码时必须采取哪些预防措施以避免内存泄漏,尤其是在处理字符串和动态内存分配时......?

平台:Linux,gcc编译器

【问题讨论】:

  • 使用自定义版本的 malloc 可以让您跟踪剩余的堆空间。定期检查。如果它随着时间的推移而缩小,肯定有泄漏。如果没有,则可能没有泄漏。

标签: c memory-management gcc memory-leaks embedded


【解决方案1】:

Valgrind 现在确实支持 ARM(它甚至支持 NEON SIMD 指令)。如果运行 debian 或 ubuntu,您应该能够通过 apt 安装 valgrind。您可能必须启用测试/不稳定存储库,但该软件包存在。

或者你当然也可以自己编译(我试过了,效果很好)。

【讨论】:

  • 是的,根据release notes,在3.6.0版本中增加了对ARM/Linux的支持。
【解决方案2】:

不要使用动态内存分配。至少我们不在航空电子系统中。

我通常使用任何一个

  1. 仅在初始化时分配所需的内存。
    如果失败,则应用程序需要更多内存。这用于驱动程序需要跟踪 N 个对象但 N 需要每个项目/应用程序可配置的情况。 在操作系统上,我为应用程序提供给操作系统的最大内存值。

  2. 使用免费和已用项目的链接列表 如果项目是固定大小的,这效果最好。然后在初始化时,驱动程序读取一个配置项,以确定它将支持的最大项。这可以从内核空间 malloc'd。如果内存不足,则需要正确指定系统资源。

  3. 使用应用程序可以从中分配但只能作为一个整体删除的内存池。 在用于航空电子设备的嵌入式 OpenGL 系统中,我们允许应用程序能够创建可变大小的对象。一旦池用完,我们就会返回一个 OUT_OF_MEMORY 错误。我们不允许应用程序随机删除对象,因为这会导致内存碎片和不确定的运行时行为。我们确实允许他们删除每个对象并根据需要重新创建它们。这具有确定性行为。

每件事都有某种约束或限制,您需要根据系统的需要来确定。这也适用于字符串数据。

【讨论】:

  • 虽然这对某些系统来说是个好建议,但并不是每个人都在做航空电子设备或其他关键任务系统。 malloc 在 ARM 处理器上有足够的空间。就像在你的手机上一样。
【解决方案3】:

考虑在台式计算机上为 ARM 设备创建一个模拟器。根据嵌入式应用程序 i/o 的复杂性和复杂性,这可能是微不足道的,也可能是极其困难的。

也许在桌面上运行应用程序的一部分(例如主要模块)就足够了,以便valgrind 可以在那里观察程序。它还可以使gdb 的使用变得相当容易。

【讨论】:

  • 设备模拟器对跟踪应用程序中的内存泄漏没有帮助。间接级别太多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2013-11-09
  • 2012-02-22
相关资源
最近更新 更多