4.1.2. 常见问题
4.1.2.1. 内存泄漏问题
内存泄漏问题的定位大概分为两步:
首先查看总内存大小,确认 Free 内存是否一直在减小:
aic /> free
memheap pool size max used size available size
---------------- ---------- ------------- --------------
heap_cma 8322232 6005296 3898528 // available size 表示的是 Free 内存的大小
heap_sys 343560 97084 261700
如果确认总内存大小一直在增加,则进行下一步。
可以通过 RT-Thread 提供的
memheaptrace
命令,查看内存的具体使用情况。
aic /> memheaptrace
memory heap address:
name : heap_cma
heap_ptr: 0x40010368
free : 0x0036d098
max_used: 0x00586510
size : 0x007efc98
--memory used information --
[0x40010368 - 2M] main // 该段内存被 main 进程使用
[0x402683a4 - 2K] main
[0x40268bc0 - 16K] main
[0x4026cc7c - 359K] // 空白的表示,该段内存是 Free 状态
[0x402c6a54 - 1M] LVGL // 该段内存被 LVGL 进程使用
[0x403f6e70 - 5K] LVGL
[0x403f854c - 109K] LVGL
[0x40413968 - 213K]
[0x40449028 - 13K] LVGL
[0x4044c804 - 4K] LVGL
[0x4044d9a0 - 13K] LVGL
[0x4045103c - 46K] LVGL
[0x4045c998 - 1M]
[0x406164f8 - 590K] LVGL
[0x406a9e34 - 1M]
通过命令的结果,可以具体分析出哪些内存占用了没有释放。
memheaptrace
命令需要在 menuconfig
配置菜单中使能:
Rt-Thread options --->
RT-Thread Kernel --->
Memory Management --->
[*] Enable memory trace
备注
内存碎片化问题也可以通过 memheaptrace
命令来进行分析。同时 RT-Thread 还提供了另一个命令 memheapcheck
来检查 heap 内存有没有被踩。