如何分析native memory leak
分析native程序发生内存泄漏问题,就需要对每一笔内存申请做记录,释放内存时清除记录,然后在认为存在内存泄漏时将记录提取出来分析,看看在哪段代码存在申请的内存没有释放。
不过native进程申请内存的方法很多,可以直接通过mmap映射内存,也可以通过传统的堆分配函数malloc分配内存。这里我们只关注通过堆分配函数引起的内存泄漏。
Android有提供这部分内存泄漏的调试方法,但这个仅适用于app进程,对于其他native进程则需要另外的方法。
[1. 打开内存监控功能(必须使用eng或userdebug版本)。
Android有提供堆调试功能
打开方法如下:
KK及以前版本:开机后用adb输入:
adb shell setprop persist.libc.debug.malloc 15
  adb shell setprop persist.libc.debug15.prog mediaserver
  adb shell setprop persist.debug15.config 0x24003024
  adb reboot
adb shell setprop persist.libc.debug.malloc 1
  adb reboot
L及之后版本:在vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.rc添加:
on init
export LD_PRELOAD libsigchain.so:libudf.so
重新打包bootimage并下载, 开机后用adb输入:
adb shell setprop persist.libc.debug.malloc 15
  adb shell setprop persist.libc.debug15.prog mediaserver
  adb shell setprop persist.debug15.config 0x4a003024
  adb reboot
O及之后版本:直接adb:
adb shell "echo libc.debug.malloc.options="backtrace=8" >> /data/local.prop"
  adb shell "echo libc.debug.malloc.program= mediaserver >> /data/local.prop"
  adb shell "chmod 644 /data/local.prop"
  adb reboot
其中红字部分修改为要监控的可执行文件名。
2. 检查是否存在内存泄漏。
打开mtklogger,不断通过adb shell procrank -u > procrank.txt查看当前系统内存的使用情况。
当看到被监控的进程占用内存(USS字段)超过了正常值很多,则可能存在内存泄漏。
3. 得到该进程内存使用分布情况($pid为被监控进程pid)
adb shell dumpsys meminfo $pid >meminfo_$pid.txt
adb shell procmem $pid > procmem_$pid.txt
4. 抓取该进程的coredump。
adb shell kill -5 $pid
5. 抓取coredump和mtklog。可以用GAT的bugreport功能一键抓取log。将以上这些抓取的coredump和log提供到e-service给MTK分析。
6. 现在这种问题也可以自行分析,用E-Consulter(mtk online的工具栏搜索得到)分析,会给出分析报告,如果存在超过128M以上的泄漏,那么分析报告会提示如下:
 == C堆检查 ==
分配器: dlmalloc, 最多允许使用: 4GB, 最多使用: 188MB, 当前使用: 166MB, 泄露阈值: 128MB, 调试等级: 1该堆已分配超过128MB (可能存在内存泄露), 以下列出分配最大尺寸和次数的调用栈:
大小: 1184字节, 已分配: 134604次
分配调用栈:libc_malloc_debug_leak.so 0x40D5ECD4() + 16libc_malloc_debug_leak.so leak_malloc() + 43libc.so malloc() + 18libsqlite.so sqlite3MemMalloc() + 14 <external/sqlite/dist/sqlite3.c:15298>libsqlite.so mallocWithAlarm() + 86 <external/sqlite/dist/sqlite3.c:18862>libsqlite.so sqlite3Malloc() + 16 <external/sqlite/dist/sqlite3.c:18895>......== 栈结束 ==大小: 1184字节, 已分配: 5149次
分配调用栈:libc_malloc_debug_leak.so 0x40D5ECD4() + 16libc_malloc_debug_leak.so leak_malloc() + 43libc.so malloc() + 18libsqlite.so sqlite3MemMalloc() + 14 <external/sqlite/dist/sqlite3.c:15298>libsqlite.so mallocWithAlarm() + 86 <external/sqlite/dist/sqlite3.c:18862>......== 栈结束 ==大小: 1048584字节, 已分配: 1次
分配调用栈:libc_malloc_debug_leak.so 0x40D5ECD4() + 16libc_malloc_debug_leak.so leak_malloc() + 43libc.so malloc() + 18libsqlite.so sqlite3MemMalloc() + 14 <external/sqlite/dist/sqlite3.c:15298>libsqlite.so mallocWithAlarm() + 86 <external/sqlite/dist/sqlite3.c:18862>libsqlite.so sqlite3Malloc() + 16 <external/sqlite/dist/sqlite3.c:18895>......== 栈结束 ==

Android系统(31)--- 如何分析native memory leak相关推荐

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

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

  2. 老罗的《Android系统源代码情景分析》翻了10遍还看不懂?因为你用错了

    最近老朽又把罗升阳老师的<Android系统源代码情景分析>拿出来啃了一番. 为什么要加个"又"呢?因为从老罗的第一版开始到迄今为止尚未更新的第三版为止,每年有学习冲动 ...

  3. 《Android系统源代码情景分析》一书勘误

    在大家的支持和鼓励下,<Android系统源代码情景分析>一书得以出版了,老罗在此首先谢过大家了.本书的内容来源于博客的文章,经过大半年的整理之后,形成了初稿.在正式出版之前,又经过了三次 ...

  4. Android系统源代码情景分析:基础知识

    老罗(罗升阳)发表在的InfoQ上的好文,最新在学习Android,转载一下,方便学习. 老罗的CSDN blog链接:http://blog.csdn.net/Luoshengyang/ 原文链接: ...

  5. Android 系统(269)---native保活5.0以上方案推演过程以及代码详述

    Android 进程常驻(4)----native保活5.0以上方案推演过程以及代码详述 这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及360获取 ...

  6. Android 系统(268)---native保活5.0以下方案推演过程以及代码详述

    Android 进程常驻(3)----native保活5.0以下方案推演过程以及代码详述 这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及360获取 ...

  7. (连载)Android系统源码分析--Android系统启动流程之Linux内核

    > **这是一个连载的博文系列,我将持续为大家提供尽可能透彻的Android源码分析 [github连载地址](https://github.com/foxleezh/AOSP/issues/3 ...

  8. android 系统源码分析

    获得Android源码后,我们来分析源码结构.源码的全部工程分为如下三个部分. ①Core Project:核心工程部分,这是建立Android系统的基础,保存在根目录的各个文件夹中. ②Extern ...

  9. Android 系统的安全性分析(1)--移动设备上的安全威胁

    声明 最近工作上涉及到对Android系统安全性的改造,在改造之前先分析整理下目前Android系统自身的安全性: 参考了一些文章及书籍,在这里大部分是对别人描述的提炼,我挑出一些对我有用的内容整理: ...

最新文章

  1. 这谁顶得住?mybatis十八连环问!
  2. Android WebView 在内部打开链接,捕获错误
  3. C语言试题五十九之请编写一个函数fun,它的功能时:求fibonacci数列中大于t的最小的一个数,结果由函数返回。
  4. 浅析dedecms织梦网站留言板提交时验证码错误的解决办法
  5. 商务专业考计算机二级,计算机二级ms考什么
  6. 图像的抽线、抽丝、抽图 神马是alpha通道
  7. 用python实现网上书店
  8. 传统机器学习和深度神经网络对比
  9. java jdk jre版本要一样吗a_JDK是什么?JRE是什么?JDK和JRE的区别?
  10. linux系统安装SAI吗,求救~~~把linux安装到C盘了
  11. 最优化方法:三、线性规划
  12. Python+Selenium程序执行完,chrome浏览器自动关闭解决方案
  13. 【ERROR】Unable to open underlying table which is differently defined or of non-MyISAM type or ...
  14. 2019.03.04【ZJOI2018】【BZOJ5212】【洛谷P4338】历史(假LCT)
  15. CMStudio中出现‘$错误‘ is not a vaild integer value如何解决
  16. 2022年湖南省临床执业医师考试第二单元随机模拟题
  17. 金蝶K3 ACTIVEX部件不能创建对象 金蝶K3一直装载进不去
  18. 力荐神器级员工考核工具:谷歌OKR
  19. DXP出现Un-Routed Net Constraint报错的一种情况和解决方法
  20. 迈柯唯Servo-s中文编修手册

热门文章

  1. Linux 内核的同步机制,第 1 部分(来自IBM)
  2. linux内核 panic,linux 内核 panic
  3. java deque_使用Deque
  4. c++计算数组均值方差_协方差分析的基本思想和应用前提(上)
  5. mysql删除所有存储过程_mysql 删除所有存储过程
  6. 【LeetCode】剑指 Offer 22. 链表中倒数第k个节点
  7. FTP和TCP、UDP
  8. thread_ThreadPoolExecutor
  9. Apache 中 .htaccess 文件设置技巧16则
  10. Windows phone UI虚拟化和数据虚拟化(一)