转载请注明出处:https://www.cnblogs.com/zzcperf/p/9563389.html

Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/C++内存泄漏的方法。

在介绍检查方法之前,先把一个技巧说在前头。因为打开检测开关,会严重影响手机性能,所以最好使用32位手机来检测,32位手机会顺畅一点。

Android 7.x / 8.x(针对root设备,调试安卓APP

1. 准备一个userdebug或eng版本手机,尽量选择32bit机器,64bit设备会非常卡,libc_malloc_debug.so需要编译进去,下载native_heapdump_viewer.py脚本备用

2. 打开debug开关。

1)如果是Android 8.x,执行以下命令

adb shell setprop wrap.<APP_PACKAGE_NAME> '"LIBC_DEBUG_MALLOC_OPTIONS=backtrace"'
adb shell am force-stop <APP_PACKAGE_NAME>

2)如果是Android 7.x (8.x 也可以用),执行以下命令,其中app_process照写,不需要针对调试的app更改

adb root
adb shell stop
adb shell setprop lib.debug.malloc.program app_process
adb shell setprop lib.debug.malloc.options "\"backtrace leak_track\""
adb shell start

3. 执行重现路径N次

4. 执行以下命令,其中/path/to/symbols/是指存放带有符号信息so文件的文件夹,默认是$ANDROID_PRODUCT_OUT/symbols。

adb shell am dumpheap -n <PID_TO_DUMP> /data/local/tmp/heap.txt

adb pull /data/local/tmp/heap.txt

python development/scripts/native_heapdump_viewer.py --html --symbols /path/to/symbols/ heap.txt > heap_info.html

5. 不重启手机,继续重复第三、第四步,即再重现N次,抓出累计重现了2N次的log,最后对比两次生成的heap_info.html

Android 5.x - 7.x(针对root设备,调试Native进程)

Google的调试方法可以参考这里,Google的方法在不断完善中,遇到问题或需要更灵活的调试方法时,可以使用下面的库。

ChkMemLeak库只有一个函数checkLeak,每次调用该函数,都输出当前进程尚未释放的内存。

对比多次输出结果,排查可疑的内存泄漏。

1. 将ChkMemLeak库添加到系统代码中。

2. 在需要调试的代码中包含头文件,调用checkLeak();在Android.mk(或.bp)动态库libcheckleak。

注意不要在线程的死循环中调用,否则会导致性能问题。

3. 打开debug开关

如果是Android 7.x / 8.x,执行以下命令

adb root
adb shell stop
adb shell setprop lib.debug.malloc.program 进程名
adb shell setprop lib.debug.malloc.options "\"backtrace leak_track\""
adb shell start

如果是Android 5.x / 6.x,执行以下命令

adb root
adb shell setprop libc.debug.malloc=1
adb shell stop
adb shell start

4. 执行调用checkLeak()的操作路径,每调用一次,都会在 /data 目录生成 checkleak_PID_timestamp.csv

size, duplications, backtrace三列分别是单次分配大小、分配次数,调用栈

找到可疑的分配路径后,使用addr2line工具找到对应的代码位置。

Android 4.x或之前版本(针对root设备,调试Native进程)

这么老的OS应该很少用了,解析调用栈的头文件是/android/system/core/include/corkscrew/backtrace.h

有需要的同学可以参照ChkMemLeak实现一下。

[教程] Android Native内存泄漏检测方法的更多相关文章

  1. [原理] Android Native内存泄漏检测原理解析

    转载请注明出处:https://www.cnblogs.com/zzcperf/articles/11615655.html 上一篇文章列举了不同版本Android OS内存泄漏的检测操作(传送门), ...

  2. 利用Android Studio、MAT对Android进行内存泄漏检测

    利用Android Studio.MAT对Android进行内存泄漏检测 Android开发中难免会遇到各种内存泄漏,如果不及时发现处理,会导致出现内存越用越大,可能会因为内存泄漏导致出现各种奇怪的c ...

  3. VS2005内存泄漏检测方法[转载]

    一.非MFC程序可以用以下方法检测内存泄露: 1. 程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __ ...

  4. Android Native 内存泄漏系统化解决方案

    导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...

  5. C++程序内存泄漏检测方法

    一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...

  6. 【转】简单内存泄漏检测方法 解决 Detected memory leaks! 问题

    我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...

  7. _CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题

    我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...

  8. Windows 下的内存泄漏检测方法

    在 Windows 下,可使用 Visual C++ 的 C Runtime Library(CRT) 检测内存泄漏. 首先,我们在.c或.cpp 文件首行插入这一段代码: #define _CRTD ...

  9. 【Visual Studio】简单内存泄漏检测方法 解决 Detected memory leaks! 问题(转)

    原文转自 http://blog.csdn.net/u011430225/article/details/47840647 我的环境是: XP SP2.VS2003 最近在一个项目中, 程序退出后都出 ...

随机推荐

  1. ES6--数组部分基础知识

    数组Array的相关方法 1.Array.from()方法 Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象 ...

  2. 如何在 Debian 9 上搭建 LNMP 环境

    步骤一.安装Nginx Nginx在默认的Debian存储库中可用. 使用以下命令更新软件包索引并安装Nginx: sudo apt update sudo apt install nginx 安装过 ...

  3. 这么设置Intellij IDEA,据说效率还不错~

    显示工具条 (1)效果图 (2)设置方法 标注1:View–>Toolbar 标注2:View–>Tool Buttons 设置鼠标悬浮提示 (1)效果图 (2)设置方法File–> ...

  4. Linux和MySQL的安装与基本操作

  5. Lagrange插值C++程序

    输入:插值节点数组.插值节点处的函数值数组,待求点 输出:函数值 代码如下:把printf的注释取消掉,能打印出中间计算过程,包括Lagrange多项式的求解,多项式每一项等等(代码多次修改,这些pr ...

  6. leetcode144 longest-palindromic-substring

    题目描述 找出给出的字符串S中最长的回文子串.假设S的最大长度为1000,并且只存在唯一解. Given a string S, find the longest palindromic substr ...

  7. java-Queue方法

    Collection>Queue // 1. 新增 add/ offer boolean add(E e); // 队列满,IllegalStateException boolean offer ...

  8. 经典c程序100例 1-10

    ==1--10 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不 ...

  9. ceph打印出每秒的IO和pg状态

    前言 在ceph 的jewel版本以及之前的版本,通过ceph -w命令是可以拿到每秒钟ceph集群的io状态的,现在的版本是ceph -s一秒秒手动去刷,ceph -w也不监控io的状态了,有的时候 ...

  10. vdbench测试实时可视化显示

    前言 前一段时间碰到一个系统,用rados bench 去跑都还比较正常,但是一跑数据库就非常慢,测试工具会抛出延时过大的提示,经过排查发现,云平台中有一台虚拟机还运行着备份数据库的服务,而这个备份软 ...