【问题标题】:Establishing if Memory Leak on Embedded Device确定嵌入式设备上是否存在内存泄漏
【发布时间】:2026-01-03 09:55:01
【问题描述】:

我有一个基于 linux 的嵌入式设备,我在其上运行 QT GUI 应用程序以及控制某些硬件的第二个应用程序。两者通过 TCP 相互通信。

我最近运行了一个系统测试,我使用 Squish 刺激 QT 应用程序一整周。在我的测试开始和结束时,我为我的两个进程中的每一个提取了 smap 和 pmap 文件。同样,我提取 meminfo 文件。

我如何比较之前和之后的文件,以大致了解我是否存在整个设备的内存泄漏问题?另外,如果检测到泄漏,我该如何粗略估计设备何时停止正常运行?

【问题讨论】:

  • 每次泄漏都是独特的检测、副作用、故障率等......

标签: linux memory-leaks embedded embedded-linux


【解决方案1】:

我如何比较之前和之后的文件以获得粗略的想法 我是否有整个设备的内存泄漏问题?

答案:

我认为您可能需要知道内核空间中使用了多少内存设备驱动程序,因此平板信息是值得研究的地方。

最初,你可以做(​​运行脚本):

cat /proc/meminfo | grep -i Slab

监控值(长时间运行后的任何增加)。

如果是这样,您可以在cat /proc/slabinfo 的帮助下查看每个条目,将泄露的内容与泄露之前的内容进行比较。

如果您熟悉每个条目的名称,(如果您确定它一定是此驱动程序中的泄漏并且大致了解它是如何分配内存的)您可以做出合理的猜测。

例如

size-4194304           0      0 4194304    1
kmem_cache           136    180    128   30

如果“kmem_cache 条目”泄漏,那么您的驱动程序可能会调用 kmem_cache_create 和 kmem_cache_alloc() 但不是免费的

如果它是“size-4194304”,您的驱动程序可能会调用 get_zeroed_pa​​ge 或 _get_free_pages 但不是免费的。

我如何才能粗略估计设备何时会 停止正常运行

答案:

如果您的用户空间没有泄漏任何内存并且泄漏仅发生在您的驱动程序中,您可以使用“free”命令来获取可用的空闲系统内存量。

那么你就可以粗略的计算一下会用多久:

(总可用内存(kbyte)/内存泄漏速度(kbyte/s)) = 秒数。

,但是内核会在此之前抱怨。

【讨论】: