Android C++ Native 内存泄露检查工具使用介绍

  • 实现原理
  • 使用方法
    • Raphael添加到测试apk
      • 添加项目依赖
      • 同步gradle
    • 启动泄露检测功能
      • 直接使用boardcast功能控制
      • 在测试代码中启动
    • 生成泄露报告
      • 调用打印功
      • 分析报告
      • 分析 maps
      • 停止监控
  • 参考

字节跳动memory-leak-detector
MemoryLeakDetector 是西瓜视频基础技术团队开发的一款 native 内存泄漏监控工具,具有接入简单、监控范围广、性能优良、 稳定性好的特点。广泛用于字节跳动旗下各大 App 的 native 内存泄漏治理,收益显著!

实现原理

raphael实现原理

使用方法

步骤如下:

  1. 添加Raphael到要检测的apk,编译运行
  2. 启动泄露检测监控
  3. 生成泄露报告:打印堆栈内容到文件
  4. 使用工具泄露数据文件和mmap文件

Raphael添加到测试apk

添加项目依赖

在Android studio的工程根目录下的build.gradle中的allprojects添加:maven { url ‘https://jitpack.io’ },如下图:

allprojects {repositories {google()jcenter()flatDir {dirs 'libs'}maven { url 'https://jitpack.io' }}
}

添加依赖项目到测试工程的app目录下的build.gradle中添加:
implementation ‘com.github.bytedance:memory-leak-detector:0.2.1’

dependencies {implementation 'com.github.bytedance:memory-leak-detector:0.2.1'
}

同步gradle

点击工具栏中的Sync project with gradle files 同步按钮

启动泄露检测功能

有2种方法启动,使用其中的一种即可:

  1. 使用Android的boardcast
  2. 添加到代码中

直接使用boardcast功能控制

监控指定so:

## 通过本地广播监控指定的so
## 0x0CF0400=Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024
adb shell am broadcast -a com.bytedance.raphael.ACTION_START -f 0x01000000 --es configs 0xCF0400 --es regex ".*libXXX\\.so$"

监控进程:

## 监控整个进程(RaphaelReceiver 组件所在的进程)
## 0x0CF0400=Raphael.MAP64_MODE|Raphael.ALLOC_MODE|0x0F0000|1024
adb shell am broadcast -a com.bytedance.raphael.ACTION_START -f 0x01000000 --es configs 0xCF0400

在测试代码中启动

本步骤是可选步骤
添加Raphael.start到测试工程的kotlin/java代码里面。使用Android Studio自动import功能补全引用。
参数、条件说明:

  1. 需要设备位置权限,比如sdcard的读写权限
  2. 可以指定具体名称如libdemo.so
class MyApplication : Application() {override fun onCreate() {// Todo: use clientID and businessID get from xiaoduEdgeManager.init(this, "testClient", 3001);Log.d(TAG, "edgeSDK:" + EdgeManager.getVersion())Raphael.start(Raphael.MAP64_MODE or Raphael.ALLOC_MODE or 0x0F0000 or 1024,"/storage/emulated/0/raphael",  // need sdcard permission".*libdemo.so$")super.onCreate()}}

生成泄露报告

只有调用打印功能或者stop功能才生成泄露报告到指定目录

调用打印功

## broadcast command
adb shell am broadcast -a com.bytedance.raphael.ACTION_PRINT -f 0x01000000

分析报告

## 聚合 report,该文件在 print/stop 之后生成,需要手动 pull 出来
## 用到离线符号符号化功能的,需将raphael.py里的addr2line改为自己本地的NDK路径
##   -r: 日志路径, 必需,手机端生成的report文件
##   -o: 输出文件名,非必需,默认为 leak-doubts.txt
##   -s: 符号表目录,非必需,有符号化需求时可传,符号表文件需跟so同名,如:libXXX.so,多个文件需放在同一目录下儿
python3 library/src/main/python/raphael.py -r report -o leak-doubts.txt -s ./symbol/## 数据格式说明
##  201,852,591 totals // 单指raphael拦截到的未释放的虚拟内存总和
##  118,212,424 libandroid_runtime.so
##   28,822,002 libhwui.so
##   24,145,920 libstagefright.so
##   15,679,488 libv8.cr.so
##    9,566,192 libc++_shared.so
##       25,536 libsqlite.so
##       12,288 libv8_libbase.cr.so
##    5,388,741 extras // raphael.py里预设了一些通用配置,可以通过修改规则进一步识别分组到extras里的数据
##
##
## bdb11000, 70828032, 66 => bdb11000是report里此堆栈第一次分配出的内存地址,70828032是report里此堆栈的内存总和,66是report里此堆栈的总次数
## 0x000656cf /system/lib/libc.so (pthread_create + 246)
## 0x0037c129 /system/lib/libart.so (art::Thread::CreateNativeThread(_JNIEnv*, _jobject*, unsigned int, bool) + 448)
## 0x00112137 /system/framework/arm/boot.oat (java.lang.Thread.nativeCreate + 142)

分析 maps

## 分析 maps
##  -m: maps文件路径,必需
python3 library/src/main/python/mmap.py -m maps

停止监控

## 广播控制
adb shell am broadcast -a com.bytedance.raphael.ACTION_STOP -f 0x01000000

参考

Android C++ Native 内存泄露检查工具Raphael使用介绍相关推荐

  1. VC内存泄露检查工具:VisualLeakDetector

    From: http://www.xdowns.com/article/170/Article_3060.html 初识Visual Leak Detector        灵活自由是C/C++语言 ...

  2. linux c 内存泄露 检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  3. Linux下几款C++程序中的内存泄露检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄露,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  4. VC内存泄露检查工具:Visual Leak Detector

    www.diybl.com 时间:2009-04-12 作者:匿名 编辑:sky 初识Visual Leak Detector        灵活自由是C/C++语言的一大特色,而这也为C/C++程序 ...

  5. Visual studio内存泄露检查工具--BoundsChecker

    BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误. BoundsChecker能检测的错误包括: 1)指针操作和内存.资源泄露错误,比如:内存泄露: ...

  6. windows客户端性能测试之内存泄露检查工具umdh.exe

    Umdh 是 Debugging Tools for Windows 中的工具,在windbg的安装目录内,UMDH主要通过分析比较进程的Heap Stack trace信息来发现内存泄露的. Umd ...

  7. android native堆内存泄露,Android Native内存泄露检测

    Android Studio没有提供直接的Native层的内存泄露检测工具,但我们仍可以通过开源工具进行动态检测和静态检测 动态检测 在APP运行时进行检测,就像LeakCanary Update: ...

  8. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...

    HeapSnap 1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于Android平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持Andoroid上 ...

  9. Ubuntu下内存泄露检测工具Valgrind的使用

    在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检 ...

最新文章

  1. 什么是原码、反码、补码?什么是按位与?范围数字按位与!
  2. 【Spark机器学习速成宝典】模型篇01支持向量机【SVM】(Python版)
  3. 做弱电机房工程的时候,如何解决机房称重问题?
  4. Git学习系列之Git的功能特性(从一般开发者的角度和主开发者的角度来剖析)...
  5. linux安装软件报错:有未能满足的依赖关系
  6. [蓝桥杯][2019年第十届真题]糖果(状压dp)
  7. aes模式_AES的完整形式是什么?
  8. 群辉挂载linux nfs,Debian 9 挂载访问已设置的群晖NFS共享文件目录
  9. 图解 Kafka,看本篇就足够啦
  10. 页面显示问题用layer插件
  11. android ble 发送指令,Android – 如何通过蓝牙低能耗(BLE)链接发送数据?
  12. Tensorflow——拟合直线
  13. semaphore的几种用法
  14. JVM内存溢出问题排查
  15. C语言中sprintf函数的用法
  16. 【电商】电商后台设计—订单中心
  17. 多电压等级计算机潮流计算,电力系统稳态分析教学心得
  18. 利用 pdf.js 实现在前端预览 .pdf 文件
  19. 读书笔记010:《伤寒论》- 足少阴肾经
  20. Word转PDF方法怎么转?这三种Word转PDF方法你得知道

热门文章

  1. 用java实现鹰眼导航_关于MapXtreme for Java鹰眼实现思路及代码
  2. 使用ESLint+Prettier来统一前端代码风格
  3. [LiteratureReview]CubeSLAM Monocular 3-D Object SLAM
  4. Ubuntu安装QT Creater和配置
  5. 新浪服务器显示蓝屏05c代码,互联网学问:蓝屏代码0x00000050的原因及解决方法...
  6. Ajax+php上传图片
  7. 勒索病毒locked勒索病毒后缀成功解密文档恢复数据库,专业事情交给专业的人
  8. python判断sqlite数据库是否存在_sqlite3 判断数据库是否存在
  9. PS - 产品精修(洗面奶)教程
  10. BetaFlight开源工程结构简明介绍