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 内存有没有被踩。