安卓Native Memory Leak(本地服务内存泄露)分析

当我们分析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这个文档

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值