转载请注明出处: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. 20201103_notepad++修改文件保存的默认格式

    修改notepad++文件保存的默认格式 点开 设置 ==> 首选项 1.  修改默认语言为要默认保存的文件格式 2. 将默认目录下的使用新样式对话框取消勾选  

  2. Learn day4 函数参数\变量\闭包\递归

    1.函数描述 # ### 函数 """ (1)函数的定义: 功能 (包裹一部分代码 实现某一个功能 达成某一个目的) (2)函数特点: 可以反复调用,提高代码的复用性,提 ...

  3. scrapy反反爬虫

    反反爬虫相关机制 Some websites implement certain measures to prevent bots from crawling them, with varying d ...

  4. 如果在Yii中,使用AR查询,不直接写sql,则在使用的时候会报错

    如果在Yii中,使用AR查询,不直接写sql,则在使用的时候会报错 Student::find() ->select("id,name,from_unixtime(create_tim ...

  5. 什么是SPI

    一.什么是SPI SPI ,全称为 Service Provider Interface,是一种服务发现机制.它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加 ...

  6. Java中的常见数学运算

    1.舍掉小数取整:Math.floor(3.5)=3 2.四舍五入取整:Math.rint(3.5)=4 3.进位取整:Math.ceil(3.1)=4 4.取绝对值:Math.abs(-3.5)=3 ...

  7. K8S 搭建 Kafka:2.13-2.6.0 和 Zookeeper:3.6.2 集群

    搭建 Kafka:2.13-2.6.0 和 Zookeeper:3.6.2 集群 一.服务版本信息: Kafka:v2.13-2.6.0 Zookeeper:v3.6.2 Kubernetes:v1. ...

  8. CF957E Contact ATC

    二维偏序(逆序对) 因为风速vf,-w<=vf<=w,因此我们可以算出每一艘船到达原点的时间的取值范围 即取vf=w和vf=-w时,记ai为当vf=w时的用时,记bi为当vf=-w时的用时 ...

  9. 利用 Docker 构建一个简单的 java 开发编译环境

    目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...

  10. python文档自译:os模块-01【说明部分】

    15.1. os - Miscellaneous operating system interfaces This module provides a portable way of using op ...