全志平臺Tina系統內存調試的方法(valgrind、pmap、手工釋放內存)
以R18 yocto爲例
valgrind
valgrind是個開源的工具,可以用來檢查內存泄露等,全志平臺上有移植,官網地址:
http://valgrind.org/downloads/current.html#current
valgrind使用方法:
1.在.bb文件裏把 valgrind配置上:
yocto/sources/meta-tina/recipes-core/images$ git diff .
diff --git a/recipes-core/images/image-tulip-mozart-chromium.bb b/recipes-core/i
index b7663b1..940c7ef 100644
--- a/recipes-core/images/image-tulip-mozart-chromium.bb
+++ b/recipes-core/images/image-tulip-mozart-chromium.bb
@@ -23,6 +23,7 @@ base_install = " \
fake-hwclock \
crash-handler \
opkg \
+ valgrind \
"
2.把yocto/build/conf/local.conf下的BB_NO_NETWORK設置爲0
BB_NO_NETWORK = "0"
3.設備端命令行:
valgrind --log-file=/tmp/valgrind.log --tool=memcheck --leak-check=full SampleApp /etc/avs/AlexaClientSDKConfig.json /etc/avs/ DEBUG9
sample-wakeup /etc/avs/config.json
即把命令sample-wakeup /etc/avs/config.json放到valgrind裏跑
不過跑的時候發現這個demo在valgrind裏跑會一直over run報錯:
info: AlsaUtils.cpp(fetch,140): hw:sndac1082003b,0, overrun occurred
info: AlsaUtils.cpp(fetch,140): hw:audiocodec,0, overrun occurred
error: InterleavedConvertor.cpp(convert,111): input param error, data: 0x66be800, samples: 0
應該是因爲valgrind本身也吃內存拖慢了進程造成的
pmap
pmap查看進程的內存映像信息(report memory map of a process)
1.ps查看進程號
2.pmap -d 1437
......
0000007fa0dfc000 24 r---- 00000000000bd000 0b3:00005 libsampleapp.so
0000007fa0e02000 4 rw--- 00000000000c3000 0b3:00005 libsampleapp.so
0000007fa0e03000 4 rw--- 0000000000000000 000:00000 [ anon ]
0000007fa0e04000 116 r-x-- 0000000000000000 0b3:00005 ld-2.26.so
0000007fa0e23000 32 rw-s- 0000000000000000 000:00006 pcmC1D0p
0000007fa0e2b000 4 rw-s- 0000000000000000 000:00005 [ shmid=0xf0000 ]
0000007fa0e2c000 8 rw--- 0000000000000000 000:00000 [ anon ]
0000007fa0e2e000 4 r---- 0000000000000000 000:00000 [ anon ]
0000007fa0e2f000 4 r-x-- 0000000000000000 000:00000 [ anon ]
0000007fa0e30000 4 r---- 000000000001c000 0b3:00005 ld-2.26.so
0000007fa0e31000 4 rw--- 000000000001d000 0b3:00005 ld-2.26.so
0000007fa0e32000 4 rw--- 0000000000000000 000:00000 [ anon ]
0000007fcb296000 132 rw--- 0000000000000000 000:00000 [ stack ]
mapped: 2546816K writeable/private: 489532K shared: 100K
最後一行的值
mapped:表示該進程映射的虛擬地址空間大小,也就是該進程預先分配的虛擬內存大小,即ps出的vsz
writeable/private:表示進程所佔用的私有地址空間大小,也就是該進程實際使用的內存大小
shared:表示進程和其他進程共享的內存大小
手工釋放內存
echo 3 > /proc/sys/vm/drop_caches