Gaodo / NativeLeakProf

Android Native代码(C/C++)内存泄露分析

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

NativeLeakProf

Android Native代码(C/C++)内存泄露分析

  • Hook内存申请本地函数,在替换函数中获取堆栈,在内存中记录申请的内存大小以及堆栈信息
  • 提供API导出动态库泄露(申请了但是未释放)的内存大小
  • 提供API导出动态库泄露堆栈到文件
  • 提供python脚本解析导出的泄露堆栈信息,并生成火焰图,python脚本

使用

添加依赖

implementation 'com.liang.qiu:nativeleakprof:1.0.1'

初始化

在Application的attachBaseContext方法里调用

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    NativeLeakProf.init(this);
}

获取动态库泄露内存大小列表信息

NativeLeakProf.dumpLeakInfo();

通过dumpLeakInfo方法,可以导出如下的字符串信息

libGLESv2_adreno.so leak: 2.258709MB
libhwui.so leak: 439.270508KB
libc.so leak: 26.500000KB

total leak: 2.713563MB

堆栈导出

调用dumpLeakStack方法导出堆栈,位置在/data/data/xxx.xxx.xxx/files/NativeLeakProf_Stack_xxxxx.txt

NativeLeakProf.dumpLeakStack();

解析堆栈

调用nl_stack_parser.py这个python脚本来解析堆栈数据(自行通过adb pull导出到电脑),举个栗子

/usr/bin/python ~/Documents/AndroidProject/NativeLeakProf/nlp_stack_parser.py ~/android/android-sdk-macosx/ndk-bundle/ ~/Documents/AndroidProject/NativeLeakProf/sample/NativeLeakProf_Stack_c39243bb-4132-4da2-88d9-1e0cfec38627.txt arm64-v8a ~/Documents/AndroidProject/NativeLeakProf/app/build/intermediates/cmake/debug/obj/arm64-v8a/

参数如下

/usr/bin/python ~/Documents/AndroidProject/NativeLeakProf/nlp_stack_parser.py "android ndk路径" "stack文件路径" "arm架构(armeabi/armeabi-v7a/arm64-v8a)" "带符号表so所在目录"

样例(有待完善)

demo

About

Android Native代码(C/C++)内存泄露分析


Languages

Language:C++ 77.2%Language:C 16.8%Language:Perl 3.9%Language:Java 0.8%Language:Python 0.6%Language:CMake 0.4%Language:Kotlin 0.3%