Android C++ Native 内存泄露检查工具Raphael使用介绍
Android C++ Native 内存泄露检查工具使用介绍
- 实现原理
- 使用方法
- Raphael添加到测试apk
- 添加项目依赖
- 同步gradle
- 启动泄露检测功能
- 直接使用boardcast功能控制
- 在测试代码中启动
- 生成泄露报告
- 调用打印功
- 分析报告
- 分析 maps
- 停止监控
- 参考
字节跳动memory-leak-detector
MemoryLeakDetector 是西瓜视频基础技术团队开发的一款 native 内存泄漏监控工具,具有接入简单、监控范围广、性能优良、 稳定性好的特点。广泛用于字节跳动旗下各大 App 的 native 内存泄漏治理,收益显著!
实现原理
raphael实现原理
使用方法
步骤如下:
- 添加Raphael到要检测的apk,编译运行
- 启动泄露检测监控
- 生成泄露报告:打印堆栈内容到文件
- 使用工具泄露数据文件和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种方法启动,使用其中的一种即可:
- 使用Android的boardcast
- 添加到代码中
直接使用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功能补全引用。
参数、条件说明:
- 需要设备位置权限,比如sdcard的读写权限
- 可以指定具体名称如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使用介绍相关推荐
- VC内存泄露检查工具:VisualLeakDetector
From: http://www.xdowns.com/article/170/Article_3060.html 初识Visual Leak Detector 灵活自由是C/C++语言 ...
- linux c 内存泄露 检查工具
Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识. 所有使用动态内存分配(dy ...
- Linux下几款C++程序中的内存泄露检查工具
Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄露,了解了一下相关的知识. 所有使用动态内存分配(dy ...
- VC内存泄露检查工具:Visual Leak Detector
www.diybl.com 时间:2009-04-12 作者:匿名 编辑:sky 初识Visual Leak Detector 灵活自由是C/C++语言的一大特色,而这也为C/C++程序 ...
- Visual studio内存泄露检查工具--BoundsChecker
BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误. BoundsChecker能检测的错误包括: 1)指针操作和内存.资源泄露错误,比如:内存泄露: ...
- windows客户端性能测试之内存泄露检查工具umdh.exe
Umdh 是 Debugging Tools for Windows 中的工具,在windbg的安装目录内,UMDH主要通过分析比较进程的Heap Stack trace信息来发现内存泄露的. Umd ...
- android native堆内存泄露,Android Native内存泄露检测
Android Studio没有提供直接的Native层的内存泄露检测工具,但我们仍可以通过开源工具进行动态检测和静态检测 动态检测 在APP运行时进行检测,就像LeakCanary Update: ...
- github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...
HeapSnap 1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于Android平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持Andoroid上 ...
- Ubuntu下内存泄露检测工具Valgrind的使用
在VS中可以用VLD检测是否有内存泄露,可以参考http://blog.csdn.net/fengbingchun/article/details/44195959,下面介绍下Ubuntu中内存泄露检 ...
最新文章
- 什么是原码、反码、补码?什么是按位与?范围数字按位与!
- 【Spark机器学习速成宝典】模型篇01支持向量机【SVM】(Python版)
- 做弱电机房工程的时候,如何解决机房称重问题?
- Git学习系列之Git的功能特性(从一般开发者的角度和主开发者的角度来剖析)...
- linux安装软件报错:有未能满足的依赖关系
- [蓝桥杯][2019年第十届真题]糖果(状压dp)
- aes模式_AES的完整形式是什么?
- 群辉挂载linux nfs,Debian 9 挂载访问已设置的群晖NFS共享文件目录
- 图解 Kafka,看本篇就足够啦
- 页面显示问题用layer插件
- android ble 发送指令,Android – 如何通过蓝牙低能耗(BLE)链接发送数据?
- Tensorflow——拟合直线
- semaphore的几种用法
- JVM内存溢出问题排查
- C语言中sprintf函数的用法
- 【电商】电商后台设计—订单中心
- 多电压等级计算机潮流计算,电力系统稳态分析教学心得
- 利用 pdf.js 实现在前端预览 .pdf 文件
- 读书笔记010:《伤寒论》- 足少阴肾经
- Word转PDF方法怎么转?这三种Word转PDF方法你得知道
热门文章
- 用java实现鹰眼导航_关于MapXtreme for Java鹰眼实现思路及代码
- 使用ESLint+Prettier来统一前端代码风格
- [LiteratureReview]CubeSLAM Monocular 3-D Object SLAM
- Ubuntu安装QT Creater和配置
- 新浪服务器显示蓝屏05c代码,互联网学问:蓝屏代码0x00000050的原因及解决方法...
- Ajax+php上传图片
- 勒索病毒locked勒索病毒后缀成功解密文档恢复数据库,专业事情交给专业的人
- python判断sqlite数据库是否存在_sqlite3 判断数据库是否存在
- PS - 产品精修(洗面奶)教程
- BetaFlight开源工程结构简明介绍