問(wèn)題背景
硬件:R128 軟件:FreeRTOS + rtplayer_test(Cedarx)+ AudioSystem
問(wèn)題復(fù)現(xiàn)
復(fù)現(xiàn)步驟:
1.rtplayer_test /data/boot.mp3
2.串口輸入"l", 循環(huán)播放
3.串口輸入"b" , 播放器后臺(tái)執(zhí)行
具體表現(xiàn)
rtplayer_test 循環(huán)播放老化音頻十幾分鐘后,音樂(lè)停止播放,報(bào)錯(cuò)如下:
問(wèn)題分析
1.根據(jù)上面報(bào)錯(cuò)的log,播放停止時(shí),系統(tǒng)內(nèi)存不足;在老化過(guò)程中出現(xiàn)的內(nèi)存不足,一般是某處存在內(nèi)存泄漏
2.reboot重啟,重新執(zhí)行老化播放流程,串口執(zhí)行free命令,觀察內(nèi)存的剩余情況:
首次播放時(shí)的內(nèi)存:
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
播放幾次后的內(nèi)存情況:
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項(xiàng)的剩余內(nèi)存,可發(fā)現(xiàn)在老化播放過(guò)程中,內(nèi)存不斷減少,存在泄漏。
泄漏點(diǎn)定位
可借助memleak工具,定位內(nèi)存泄漏處。mrtos menuconfig選上memleak
- > System components
- > aw components
- > Memleak Components Support
[*] Tina RTOS Memleak # 使能內(nèi)存泄露分析工具
(16) Tina RTOS Memleak Backtrace Level # 內(nèi)存泄露分析?;厮輰訑?shù)
[] Tina RTOS Double Free Check
memleak用法如下
作用:內(nèi)存泄露分析
用法:memleak 1 使能內(nèi)存泄露分析,記錄所有內(nèi)存塊申請(qǐng)、釋放信息
memleak 0 關(guān)閉內(nèi)存泄露分析,刪除所有內(nèi)存塊的申請(qǐng)、釋放信息
memleak 1 thread_name1 thread_name2 使能內(nèi)存泄露分析,記錄指定任務(wù)的內(nèi)存塊申請(qǐng)、釋放信息
串口執(zhí)行memleak 1
音頻老化測(cè)試(參考復(fù)現(xiàn)步驟),音頻播放幾次后,執(zhí)行rtpc q 命令退出播放
串口執(zhí)行memleak 0
關(guān)閉內(nèi)存泄露檢測(cè)時(shí),會(huì)打印可疑的內(nèi)存泄露點(diǎn)及其回溯信息;
有兩個(gè)地方:
007: ptr = 0x08760960, size = 0x00000f00, thread = AudioRender
backtrace : 0x08336AEE
backtrace : 0x08336B46
backtrace : 0x08396D52
backtrace : 0x084B025E
backtrace : 0x08446856
backtrace : 0x084496C6
008: ptr = 0x0875f990, size = 0x00000f00, thread = AudioRender
backtrace : 0x08336AEE
backtrace : 0x08336B46
backtrace : 0x0839757E
backtrace : 0x084B025E
backtrace : 0x08446856
backtrace : 0x084496C6
callstack 回溯
pvPortMalloc at /workspace/freertos/r128/test_0624_rtplayer/rtos-dev/lichee/rtos/kernel/FreeRTOS-orig/Source/portable/MemMang/heap_4.c:658
pvPortCalloc at /workspace/freertos/r128/test_0624_rtplayer/rtos-dev/lichee/rtos/kernel/FreeRTOS-orig/Source/portable/MemMang/heap_4.c:577
softvol_ap_update_mode at /workspace/freertos/r128/test_0624_rtplayer/rtos-dev/lichee/rtos/components/common/aw/AudioSystem/audio_plugin/softvolume.c:250
_AudioTrackStart at //workspace/rtos-r128/lichee/rtos/components/common/aw/AudioSystem/AudioTrack.c:163
RTSoundDeviceStart at /workspace/codec_lib/cedarx_rtos/temp/rtos_cedarx/cedarx/rtos_out/libcore/playback/src/rtosSoundControl.c:766
startSoundDevice at /workspace/codec_lib/cedarx_rtos/temp/rtos_cedarx/cedarx/rtos_out/libcore/playback/src/audioRenderComponent.c:800
(inlined by) doRender at /workspace/codec_lib/cedarx_rtos/temp/rtos_cedarx/cedarx/rtos_out/libcore/playback/src/audioRenderComponent.c:942
(inlined by) doRender at /workspace/codec_lib/cedarx_rtos/temp/rtos_cedarx/cedarx/rtos_out/libcore/playback/src/audioRenderComponent.c:898
通過(guò)回溯信息,發(fā)現(xiàn)在resample_ap_update_mode
處產(chǎn)生了內(nèi)存泄漏。
根本原因
播放器老化過(guò)程中,只調(diào)用AudioTrackCreate
一次,循環(huán)播放時(shí)會(huì)多次調(diào)用_AudioTrackStart
,最后退出播放才調(diào)用AudioTrackDestroy
銷毀;所以softvol_ap_update_mode
這里,老化過(guò)程會(huì)多次調(diào)用到,會(huì)有多次分配,但只在退出時(shí)AudioTrackDestroy
里才銷毀。
解決方法
只在AudioTrackCreateWithStream
時(shí)創(chuàng)建一次,AudioTrackDestroy
,測(cè)試10小時(shí)左右未出現(xiàn)內(nèi)存泄漏
-
FreeRTOS
+關(guān)注
關(guān)注
12文章
483瀏覽量
61915 -
ADB驅(qū)動(dòng)
+關(guān)注
關(guān)注
0文章
13瀏覽量
6259 -
R128
+關(guān)注
關(guān)注
0文章
41瀏覽量
93
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論