内存泄露调试案例
问题背景
硬件:R128 软件:FreeRTOS + rtplayer_test(Cedarx)+ AudioSystem
问题复现
复现步骤:
- rtplayer_test /data/boot.mp3
- 串口输入"l", 循环播放
- 串口输入"b" , 播放器后台执行
具体表现
rtplayer_test 循环播放老化音频十几分钟后,音乐停止播放,报错如下:
问题分析
- 根据上面报错的log,播放停止时,系统内存不足;在老化过程中出现的内存不足,一般是某处存在内存泄漏
- reboot重启,重新执行老化播放流程,串口执行free命令,观察内存的剩余情况:
首次播放时的内存:
c906>free
==> Round [1] <==
Total Heap Size : 1907128 Bytes ( 1862 KB)
Free : 547632 Bytes ( 534 KB)
Min Free : 536208 Bytes ( 523 KB)
List Task MIN Free Stack(unit: word)
Task State Priority Stack #
************************************************
Name State Pri HWM Idx StkCur StkBot
adb-shell X 4 394 44 0x87233a0 0x8722650
AudioDecode R 4 3872 49 0x874d2c0 0x87459c0
IDLE R 0 52 2 0x863dfe0 0x863de40
tcpip B 3 470 12 0x8677ae0 0x8676c30
Demux B 6 3126 47 0x87333a0 0x872b960
usb-hardware-sc B 6 8018 14 0x871a3a0 0x870a630
adbd-input B 5 900 24 0x876eb90 0x876cec0
amp-admin B 6 4002 11 0x8675ab0 0x866dda0
AudioMT2pb B 4 3882 52 0x8779be0 0x8772050
AudioRender B 6 3350 50 0x8756950 0x874ed30
amp-ser2 B 6 4006 8 0x865d830 0x8655b00
amp-ser3 B 6 4006 9 0x8665910 0x865dbe0
amp-ser4 B 6 4006 10 0x866d9f0 0x8665cc0
hub-main-thread B 6 8082 13 0x870a2b0 0x86fa620
adbd-shell-ser- B 4 906 45 0x8726330 0x8724660
XPlayer B 4 3912 48 0x8744e10 0x873d220
AudioMT2 B 4 1907 18 0x873cb00 0x8738e10
RTplayerThread B 4 3989 51 0x876a630 0x8762980
CLI B 6 3772 15 0x8722060 0x871a640
Tmr Svc B 6 374 3 0x863f070 0x863e320
amp-send-task B 6 930 4 0x8642db0 0x8641070
amp-recv-task B 6 924 5 0x8644e90 0x8643150
adbd-output B 5 843 25 0x8770cd0 0x876f060
adb-event B 5 894 46 0x872a300 0x87286d0
amp-ser0 B 6 4006 6 0x864d670 0x8645940
amp-ser1 B 6 4006 7 0x8655750 0x864da20
播放几次后的内存情况:
c906>free
==> Round [1] <==
Total Heap Size : 1907128 Bytes ( 1862 KB)
Free : 456992 Bytes ( 446 KB)
Min Free : 453440 Bytes ( 442 KB)
List Task MIN Free Stack(unit: word)
Task State Priority Stack #
************************************************
Name State Pri HWM Idx StkCur StkBot
adb-shell X 4 394 44 0x87235b0 0x8722650
AudioDecode R 4 3872 49 0x874d5e0 0x87459c0
IDLE R 0 52 2 0x863dfe0 0x863de40
tcpip B 3 458 12 0x8677ae0 0x8676c30
usb-hardware-sc B 6 8018 14 0x871a3a0 0x870a630
adbd-input B 5 900 24 0x876eb90 0x876cec0
amp-admin B 6 4002 11 0x8675ab0 0x866dda0
AudioMT2pb B 4 3882 52 0x8779be0 0x8772050
AudioRender B 6 3350 50 0x8756950 0x874ed30
CLI B 6 3772 15 0x8722060 0x871a640
Tmr Svc B 6 374 3 0x863f070 0x863e320
amp-ser0 B 6 4006 6 0x864d670 0x8645940
amp-ser1 B 6 4006 7 0x8655750 0x864da20
amp-ser2 B 6 4006 8 0x865d830 0x8655b00
amp-ser3 B 6 4006 9 0x8665910 0x865dbe0
amp-ser4 B 6 4006 10 0x866d9f0 0x8665cc0
hub-main-thread B 6 8082 13 0x870a2b0 0x86fa620
XPlayer B 4 3912 48 0x8744e10 0x873d220
AudioMT2 B 4 1907 18 0x873cb00 0x8738e10
adbd-output B 5 843 25 0x8770cd0 0x876f060
amp-recv-task B 6 924 5 0x8644e90 0x8643150
Demux B 6 3126 47 0x8733150 0x872b960
amp-send-task B 6 924 4 0x8642db0 0x8641070
adb-event B 5 890 46 0x872a2a0 0x87286d0
adbd-shell-ser- B 4 906 45 0x8726330 0x8724660
RTplayerThread B 4 3989 51 0x876a630 0x8762980
观察Free项的剩余内存,可发现在老化播放过程中,内存不断减少,存在泄漏。