内存泄露问题
内存泄漏问题的定位大概分为两步:
- 首先查看总内存大小,确认 Free 内存是否一直在减小:
aic /> free
memheap pool size max used size available size
---------------- ---------- ------------- --------------
heap_cma 8322232 6005296 3898528 // available size 表示的是 Free 内存的大小
heap_sys 343560 97084 261700
1
2
3
4
5
2
3
4
5
如果确认总内存大小一直在增加,则进行下一步。
- 可以通过 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]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
通过命令的结果,可以具体分析出哪些内存占用了没有释放。
memheaptrace
命令需要在 menuconfig
配置菜单中使能:
Rt-Thread options --->
RT-Thread Kernel --->
Memory Management --->
[*] Enable memory trace
1
2
3
4
2
3
4
WARNING
内存碎片化问题也可以通过memheaptrace
命令来进行分析。同时 RT-Thread 还提供了另一个命令 memheapcheck
来检查 heap
内存有没有被踩。
踩内存问题
踩内存问题如果查看到固定的地址被踩,可以通过 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) 查看触发异常的调用栈
1
2
3
4
5
6
7
2
3
4
5
6
7