Edit online

常见问题

4 Dec 2024
Read time: 2 minute(s)

内存泄漏问题

内存泄漏问题的定位分为以下两步:

  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

    如果确认总内存大小一直在增加,则进行下一步。

  2. 通过 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]
  3. 通过命令的结果,可以具体分析出哪些内存占用了没有释放。

    memheaptrace 命令需要在 menuconfig 配置菜单中使能:
    Rt-Thread options  --->
        RT-Thread Kernel  --->
            Memory Management  --->
                [*] Enable memory trace

踩内存问题

踩内存问题如果查看到固定的地址被踩,可以通过 JTAG 调试器连接上 CPU,使用 WatchPoint 功能来侦测对内存地址的异常访问:
(gdb) p &_console_device->rx_indicate
$3 = (rt_err_t (**)(rt_device_t, rt_size_t)) 0x40002164 <serial+40>
(gdb) watch *0x40002164                    // (1) 设置 watch 断点
Hardware watchpoint 1: *0x40002164
(gdb) c                                    // (2) 继续运行,等待异常触发
Breakpoint 1, xxxx                         // (3) 异常访问触发 watchpoint 断点
(gdb) bt                                   // (4) 查看触发异常的调用栈