当我们分析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(本地服务内存泄露)分析相关推荐

  1. Android系统(31)--- 如何分析native memory leak

    如何分析native memory leak 分析native程序发生内存泄漏问题,就需要对每一笔内存申请做记录,释放内存时清除记录,然后在认为存在内存泄漏时将记录提取出来分析,看看在哪段代码存在申请 ...

  2. Android 系统(30)---如何用DDMS分析native memory leak

    native程序如果发生内存问题,一般都比较难查,幸好DDMS有集成native memory leak(仅仅针对app,无法分析mediaserver等非app的进程)功能,通过DDMS可以观察na ...

  3. JAVA内存泄露分析和解决方案及WINDOWS自带查看工具

    JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...

  4. 一次.net托管内存泄露分析

    简介:一次.net托管内存泄露分析 最近协助分析了一个.net进程内存泄露的问题,过程分享给大家. 症状:客户的服务端.net进程出现分钟级的cpu抖动,接近100%后落回. 图1 分析:支持同学通过 ...

  5. 如何使用MAT进行JVM内存泄露分析

    转载自  如何使用MAT进行JVM内存泄露分析 在<Java Agent的隔离实现以及卸载时一些坑>中,卸载Agent之后,使用 jmap-histo:live pid命令验证执行FGC, ...

  6. java内存泄露分析方案

    java内存泄露分析方案 - 准备工作 1.工具:Memory Analyzer Tool (mat); 1)安装Memory Analyzer Tool (mat) 2.原料:dump.hprof ...

  7. 记一次 JAVA 的内存泄露分析

    记一次 JAVA 的内存泄露分析 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 当前环境 jdk == 1.8 httpasyn ...

  8. 内存泄漏(Memory Leak )和内存溢出

    内存泄漏(Memory Leak ) 一.概述 二.内存泄漏举例 1.单例模式 2. 资源未关闭 三.内存溢出 一.概述 什么是内存泄漏:对象不被使用,并且GC无法对其回收的情况. 宽泛意义上的内存泄 ...

  9. java分析内存泄露工具_Eclipse Memory Analyzer(Java内存泄漏分析工具)

    概述 一个大型的Java项目也许从开发到测试结束并未发现一些大的问题,但是在生产环境中还是会出现一些非常棘手的问题,如内存泄漏,遇到这样的问题对于一个经验尚浅的开发人员来说难度非常大,好的一点是JVM ...

  10. 关于安卓LiveData的一点可能造成内存泄露的细节问题

    LiveData最重要的一个特性是具有生命周期感知能力,当Activity或者Fragment处于活跃状态时,观察者才能观察到LiveData的变化. 如果这一点没理解好就容易犯难以察觉的错误.无论是 ...

最新文章

  1. ATS日志格式中的Squid-和Netscape-格式的缓存结果码
  2. python四十九:封装
  3. 模块式lamp fpm式lamp
  4. PHP5.5安装GeoIP扩展
  5. c语言中说取消标识符是,2019年全国计算机二级C语言考试考点解析(3)
  6. AMD和CMD出生的背景和它们解决的问题
  7. 你可能不知道的跨域解决方案
  8. 解决QTreeWidget中item无法整行同时显示相同颜色
  9. solr hdfs solr.in.sh
  10. web全栈架构师所需技术栈_统一架构–一种构建全栈应用程序的简单方法
  11. Ubuntu zip压缩文件夹 和解压文件
  12. 初识 Hbase 数据库
  13. ThinkPHP一键检测ThinkPHP漏洞,漏洞检测工具
  14. excel系列【下拉项二选一】
  15. java-php-python-ssm信贷管理系统计算机毕业设计
  16. 突变点检测:Pettitt突变点检测(python)
  17. Spsice仿真实验 例B-1
  18. 关于引用elasticsearch-rest-high-level-client版本冲突问题
  19. SQL 语句的多表查询方式
  20. HDU - 3003 - Pupu(快速幂)

热门文章

  1. 鲲鹏芯片的服务器,鲲鹏处理器及服务器介绍.pdf
  2. gnss_伽利略gnss消息认证过程
  3. 深入理解多线程(四)— Moniter的实现原理
  4. 蓝牙 UUID 解释
  5. 关于微信jsapi 支付签名验证失败
  6. 人人都是架构师:分布式系统架构落地与瓶颈突破 - china-pub网上书店
  7. 人力资源数据分析师前景_5-数据分析师前景怎么样
  8. 02 凸优化理论-凸集
  9. Python图像绘制字符画
  10. Android高德地图导航or语音播报