常见问题
4 Dec 2024
Read time: 2 minute(s)
内存泄漏问题
内存泄漏问题的定位分为以下两步:
-
查看总内存大小,确认 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
踩内存问题
踩内存问题如果查看到固定的地址被踩,可以通过 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) 查看触发异常的调用栈