LeakTracer 的内存泄露日志
# LeakTracer report diff_utc_mono=1685831038.201270 leak, time=1832269.756888, stack=0x61b18 0x66024 0x662b8 0x5f5d0 0x6d36aed8, size=100, data=.p..z...............z.............................
使用addr2line命令行查看到的堆栈信息
很明显已经定位到了泄露的位置
不过整个流程稍微有点长,大致步骤为:
- adb连接手机,方便我们后续使用adb命令将leaktracer的泄露日志拉取到电脑分析
- 安装app,并产生leaktracer的泄露日志
- adb pull leak-report.txt
- 使用addr2line命令分析leak-report.txt,这里面需要提取出stack,还需要配合对应的so文件
- 跳转到对应的源码位置,分析堆栈,找出原因。
所以就顺手写了一个vscode插件,从手机上将这个日志导入到插件,自动分析日志,图形化展示出来,点击跳转到源码,方便快速定位。
插件已经发布到vscode扩展商店。
插件的配置项
"a2la.ips": ["192.168.1.33:6666"],// 记录手机的ip,主要是为了连接手机,方便后续调用adb命令 "a2la.apps": ["com.example.jni"],// 拉取日志的app包名 "a2la.leak-file": "files/Documents/leak_report.txt",// 内存泄露日志文件 "a2la.local-files": { // 每一次拉取分析日志,都会将日志保存到本地 "192.168.1.23:6666-com.example.jni": [ "C:\\Users\\cc\\leak\\leak_report_1687316414070.txt", "C:\\Users\\cc\\leak\\leak_report_1687316889163.txt", "C:\\Users\\cc\\leak\\leak_report_1687317321308.txt" ], "192.168.1.33:6666-com.example.jni": [ "C:\\Users\\cc\\leak\\leak_report_1687655352416.txt", "C:\\Users\\cc\\leak\\leak_report_1687660996658.txt", "C:\\Users\\cc\\leak\\leak_report_1687663468221.txt", "C:\\Users\\cc\\leak\\leak_report_1687663556916.txt" ] }, "a2la.executable-file": "g:\\proj\\jni\\app\\build\\intermediates\\ndkBuild\\debug\\obj\\local\\arm64-v8a\\libjni.so"// 带符号表的对应so库文件
a2la.app
a2la.leak-file
是为adb pull命令服务的,因为我的日志是保存在getExternalFilesDirs(Environment.DIRECTORY_DOCUMENTS);
adb pull /storage/emulated/0/Android/data
/com.example.jni
/files/Documents/leak_report.txt