安卓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这个文档
安卓Native Memory Leak(本地服务内存泄露)分析相关推荐
- Android系统(31)--- 如何分析native memory leak
如何分析native memory leak 分析native程序发生内存泄漏问题,就需要对每一笔内存申请做记录,释放内存时清除记录,然后在认为存在内存泄漏时将记录提取出来分析,看看在哪段代码存在申请 ...
- Android 系统(30)---如何用DDMS分析native memory leak
native程序如果发生内存问题,一般都比较难查,幸好DDMS有集成native memory leak(仅仅针对app,无法分析mediaserver等非app的进程)功能,通过DDMS可以观察na ...
- JAVA内存泄露分析和解决方案及WINDOWS自带查看工具
JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...
- 一次.net托管内存泄露分析
简介:一次.net托管内存泄露分析 最近协助分析了一个.net进程内存泄露的问题,过程分享给大家. 症状:客户的服务端.net进程出现分钟级的cpu抖动,接近100%后落回. 图1 分析:支持同学通过 ...
- 如何使用MAT进行JVM内存泄露分析
转载自 如何使用MAT进行JVM内存泄露分析 在<Java Agent的隔离实现以及卸载时一些坑>中,卸载Agent之后,使用 jmap-histo:live pid命令验证执行FGC, ...
- java内存泄露分析方案
java内存泄露分析方案 - 准备工作 1.工具:Memory Analyzer Tool (mat); 1)安装Memory Analyzer Tool (mat) 2.原料:dump.hprof ...
- 记一次 JAVA 的内存泄露分析
记一次 JAVA 的内存泄露分析 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 当前环境 jdk == 1.8 httpasyn ...
- 内存泄漏(Memory Leak )和内存溢出
内存泄漏(Memory Leak ) 一.概述 二.内存泄漏举例 1.单例模式 2. 资源未关闭 三.内存溢出 一.概述 什么是内存泄漏:对象不被使用,并且GC无法对其回收的情况. 宽泛意义上的内存泄 ...
- java分析内存泄露工具_Eclipse Memory Analyzer(Java内存泄漏分析工具)
概述 一个大型的Java项目也许从开发到测试结束并未发现一些大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常大,好的一点是JVM ...
- 关于安卓LiveData的一点可能造成内存泄露的细节问题
LiveData最重要的一个特性是具有生命周期感知能力,当Activity或者Fragment处于活跃状态时,观察者才能观察到LiveData的变化. 如果这一点没理解好就容易犯难以察觉的错误.无论是 ...
最新文章
- ATS日志格式中的Squid-和Netscape-格式的缓存结果码
- python四十九:封装
- 模块式lamp fpm式lamp
- PHP5.5安装GeoIP扩展
- c语言中说取消标识符是,2019年全国计算机二级C语言考试考点解析(3)
- AMD和CMD出生的背景和它们解决的问题
- 你可能不知道的跨域解决方案
- 解决QTreeWidget中item无法整行同时显示相同颜色
- solr hdfs solr.in.sh
- web全栈架构师所需技术栈_统一架构–一种构建全栈应用程序的简单方法
- Ubuntu zip压缩文件夹 和解压文件
- 初识 Hbase 数据库
- ThinkPHP一键检测ThinkPHP漏洞,漏洞检测工具
- excel系列【下拉项二选一】
- java-php-python-ssm信贷管理系统计算机毕业设计
- 突变点检测:Pettitt突变点检测(python)
- Spsice仿真实验 例B-1
- 关于引用elasticsearch-rest-high-level-client版本冲突问题
- SQL 语句的多表查询方式
- HDU - 3003 - Pupu(快速幂)