转载请注明出处: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. 【实战】记一次老项目的swagger整合

    1.背景 这两天接到一个整合swagger的任务,本以为很简单,预计两小时内完成,没想到其中有太多的坑,整了两天才完成. 首先项目是一个比较老的项目,之前用的servlet,目前在重构为springm ...

  2. ModelSerializer 高级使用

    前言 ModelSerializer中还具有一些高级用法,如批量更新.批量删除.批量创建等. 但是批量过来的数据格式都需要与前端做好协商,什么样的数据格式是单条操作,什么样的数据格式是批量操作. 如下 ...

  3. python开发基础(二)运算符以及数据类型之dict(字典)

    # encoding: utf-8 # module builtins # from (built-in) # by generator 1.147 """ Built- ...

  4. ci之 core下CodeIgniter源码分析(1)

    ci 执行流程 index.php 文件 加载codeigniter文件 codeigniter部分里面加载的: 加载配置文件constants 加载全局公共函数core/Common.php 文件 ...

  5. Thinkphp3.2 cms之分类管理

    四.分类管理 <?php namespace Admin\Controller; use Think\Controller; class CateController extends Contr ...

  6. 最全总结 | 聊聊 Python 办公自动化之 Excel(中)

    1. 前言 上一篇文章中,我们聊到使用 xlrd.xlwt.xlutils 这一组合操作 Excel 的方法 最全总结 | 聊聊 Python 办公自动化之 Excel(上) ​本篇文章将继续聊另外一 ...

  7. ssh连接缓慢的问题分析

    之前遇到ssh连接缓慢的问题 一般会检查Server端 /etc/ssh/sshd_config配置文件的两个地方 1.设置UseDNS no 因为我们ssh连接服务器的话 如果UseDNS选项是打开 ...

  8. Azure Data Factory(五)Blob Storage 密钥管理问题

    一,引言 之前讲解的ADF 集成Azure DevOps 实现CI/CD,在 Releases Pipeline 阶段,我们是将两个 Blob Storage 的链接字符串复制.粘贴到 "O ...

  9. Python爬取B站耗子尾汁、不讲武德出处的视频弹幕

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前言 耗子喂汁是什么意思什么梗呢?可能很多人不知道,这个梗是出自马保国,经常上网的人可能听说过这个 ...

  10. Ceph数据盘怎样实现自动挂载

    前言 在Centos7 下,现在采用了 systemctl来控制服务,这个刚开始用起来可能不太习惯,不过这个服务比之前的服务控制要强大的多,可以做更多的控制,本节将来介绍下关于 Ceph的 osd 磁 ...