当我们分析app的内存泄露时,使用Android Studio自带的profile工具可以比较方便,但是当我们需要调试一些c/c++本地服务进程的时候就不是很方便了。由于有客户题出了camera 一直录影的状态下发现android.hardware.camera.provider@2.4-service”占用的memory会一直增加。
所以需要使用接下来的方法来进行内存泄露调试。
这种方法就是malloc_debug,这是安卓自带的调试工具,基于libc来实现,通过截取我们的调用堆栈来监控内存使用情况。
首先需要确定自己的安卓版本,在安卓p以前的老版本需要打上patch才能正常使用。由高通提供链接如下:
Android M:
https://www.codeaurora.org/patches/quic/la/PATCH_175270_SBAforTaskidCaseid_20161211.
tar.gz
Android N:
https://www.codeaurora.org/patches/quic/la/PATCH_175274_SBAforTaskidCaseid_20161212.
tar.gz
Android O:
https://source.codeaurora.org/quic/la/platform/bionic/commit/libc/malloc_debug?h=
android-framework.lnx.3.1&id=0c0fee17b7f39e841f6ef5d305adb1d5189dfb25
https://source.codeaurora.org/quic/la/platform/bionic/commit/?h=android-framework.lnx.3.0&id=
e948d32366b3619418c48a3ada064e0ab0f8c49a
但是在Android P以后就不需要再打patch了,可以直接使用。
具体的malloc_debug介绍可以去源码目录下通过README来了解platform/bionic/+
/master/libc/malloc_debug/README.md。
在我们调试之前首先要获取root权限并且临时关闭selinux调到宽容模式。
通过如下命令来实现:
1. $adb root
2. $adb shell setenforce 0
3. $adb shell setprop libc.debug.malloc.program audioserver
这里跟的是需要调试的进程名,如果我们需要调试android.hardware.camera.provider@2.4-service这里就是
adb shell setprop libc.debug.malloc.program android.hardware.camera.provider@2.4-service
4. Set property of libc.debug.malloc.options
For Windows PC:
$adb shell setprop libc.debug.malloc.options "\"backtrace leak_track"\"
For Ubuntu PC:
$adb shell setprop libc.debug.malloc.options "backtrace leak_track"
其中的参数选项可根据自己的需求来添加,具体参数解释可阅读readme
5. 这些操作会使我们的系统速度降低,比较占用cpu以及内存,所以我们可以通过如下的方式让系统流畅一些
首先通过ls命令查看
'ls /sys/devices/system/cpu/cpufreq/' 得到 cpufreq policys, 如果发现 policy0 and policy6 执行如下命令:
echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
echo performance > /sys/devices/system/cpu/cpufreq/policy6/scaling_governor
Tips, Don't need to reboot device, It will work after restart camera provider
6. adb shell
#ps -Af|grep camera.provier
#cameraserver 752 1 8 02:59:12 ? 00:03:36 android.hardware.camera.provider@2.4-service
#kill -9 752 //kill the process to enable malloc_debug.
After the process restart logcat will print these logs:
malloc_debug: /system/bin/cameraserver: Run: 'kill -47 9109' to dump the backtrace.
7. Reproduce issue and trigger leak debug code.
8. adb shell kill -47 9109, logcat will print log:
malloc_debug: Dumping to file: /data/local/tmp/backtrace_heap.9109.txt
9. How to parse backtrace_heap.9109.txt as txt or html.
python development/scripts/native_heapdump_viewer.py --verbose --html backtrace_heap
.4583.txt --symbols ./out/target/product/sdm[***]/symbols > backtrace_heap.html
And more information please refer to https://android.googlesource.com/platform/bionic/+/
master/libc/malloc_debug/README.md#backtrace-heap-dump-format
native_heapdump_viewer.py: Suggest use the latest version https://
android.googlesource.com/platform/development/+/master/scripts/
native_heapdump_viewer.py
10. For improving the performance, you'd better to add the customized unwind function mentioned
in KBA: KBA-170703210015: Customized unwind function was designed for optimizing the 'unwind'
call stack function.这里是高通的调优文档,因为在64位的操作系统中使用malloc_debug可能会非常卡顿,所以需要参考170703210015这个文档