传音AD9项目报告的内存泄漏问题,家里的内存测试方式比较难以复现,所以想和传音测试对齐,使用同种的测试方式来复现问题
-------------使用工具---------------
mtk coredump 功能、coredump文件解析工具 GAT(Official)_ALPS、coredump报告分析工具 SpOfflineDebugSuite(Official)_ALPS。工具都包括windows&linux版本
------------使用流程简介----------
1、开启mtk coredump、malloc debug
2、进行测试case的压测,可以进行大量的压测为基础,在即将运行结束的时候kill 掉 需要进行内存跟踪的线程
3、获取到产生的coredump文件,使用GAT工具进行解析
4、对解析生成的db文件夹进行 数据分析,产生对应的报告
-----------详细的的使用流程和设置命令---------
1、开启mtk coredump、malloc debug
打开 coredump:
手机平台对应的是mtk的版本,一般测试使用的手机都是root版本,O版本之后都是默认开启coredump功能的。
具体的查看方法: adb shell getprop | grep aeev.core
出现对应的属性值是 enable就是证明打开了coredump,如下所示
[persist.vendor.aeev.core.direct]: [enable]
[persist.vendor.aeev.core.dump]: [enable]
如果没有打开,使用下面命令打开即可
adb shell setprop persist.vendor.aeev.core.direct enable
adb shell setprop persist.vendor.aeev.core.dump enable
打开之后,需要设置mode的级别,不设置的话可能不出现coredump文件
adb shell setprop persist.vendor.mtk.aeev.mode 3
adb shell setprop persist.vendor.mtk.aee.mode 3
设置之后最好查看一下是否成功,保证最快抓到需要的的文件
设置malloc debug:
使用下面的命令可以暂时的监控对应的线程程序,重启之后就会失效,设置之后可以使用 adb shell getprop进行查看是否设置成功:
adb shell setprop libc.debug.malloc.options \”backtrace=8 guard=8 leak_track\”
adb shell setprop libc.debug.malloc.program native_exec
adb shell setprop libc.debug.malloc.program camerahalserver
其中program代表的是要监控的线程名称,native_exec就是我们的本地SDK测试的可执行文件,camerahalserver就是在线的SDK所在的进程名称,如果想监控app程序,直接设置对应app
进程名就可以了
第二种方式,就是单独建立一个prop文件来放置使用的属性值,这样重启还是生效的
adb shell "echo libc.debug.malloc.options = \"backtrace=8 guard=8 leak_track\" >> /data/local.prop"
adb shell "echo libc.debug.malloc.program = camerahalserver >> /data/local.prop"
adb shell "chmod 644 /data/local.prop"
adb reboot
2、环境准备好了,接下来就是傻瓜式的进行cases的测试,具体测试次数依据自己的实际情况进行判断。等到测试快要结束的时候,这个是相对与离线测试条件下,如果不及时的kill 进程,就不会产生
对应的coredump文件了。这个需要注意。对于在线来说,因为本身camerahalserver相机打开状态就一直在运行。所以在线的进程kill可以再测试结束一段时间之后,可以排除一些不必要的内存问题
具体的杀死进程命令,下面命令才能出现NE的错误,产生coredump文件,注意杀死对应的进程的ID
adb shell kill -11 $pid
3、获取对应的db文件,具体的目录是在 /data/aee_exp/ 或者是 /data/vendor/aee_exp 目录下面 ,甚至有的手机会在 /data/debuglogger/ 目录下面,注意查看一下
具体的文件加是 下面这种格式的 db.00.NE db.01.NE ,使用 adb pull 拉到本地就可以了
4、文件的解析,使用两个工具解析就可以了
4.1 使用GAT解析 db.00.NE.dbg ,生成 db.00.NE.dbg.DEC 解析文件夹目录
linux版本:
./gat-linux-x86_64-4/modules/spsst/tools/aee_db_extract 可执行文件后面直接加db文件即可。最新版本的aee_extract 直接将内部的coredump.dbg也解析出来了,所以直接使用aee_extract就OK了
./gat-linux-x86_64-4/modules/spsst/tools/aee_db_extract path/db.00.NE.dbg
windows版本:
会有对应的exe文件,在dos命令窗口下面解析即可,可以参照上面目录找到对应的windows版本的执行文件
path/aee_db_extract.exe path/db.00.NE.dbg
5、使用SpOfflineDebugSuite 工具解析生成内存报告
SpOfflineDebugSuite 使用对应系统文件可以正常解析文件,需要在sysmbol中放入libc.so文件就可以解析出来对应的c_leak.txt文件,如果不放入c_leak.txt文件就不能生成具体的泄露信息。因为malloc debug这个堆信息
最底层是基于libc.so这个标准库函数的,所以需要有这个库来进行报告的栈信息解析,如果没有这个文件会报下面的问题:
sample: 这个依据版本实际使用的libc.so
加入libc.so就会正常:
正常回车之后的界面如下,使用对应命令生成对应文件就可以了:
其中 l 对应生成 c_leak.txt 文件,包含的是存在泄露的栈信息
dc 对应生成的是 c_heap.txt,包含的是c堆的内容
df 对应的生成的是 fd_dump.txt,包含的是句柄泄露的内容
其中c_leak.txt文件的具体内容格式如下:
具体使用是 linux ./OfflineSST64 /home/liulei/test/db.00.NE/db.00.NE.dbg.DEC 先解析生成sysmbol文件夹,然后放入libc.so文件,再次解析,按照提示进行对应文件的生成,其中 l <num> : l 100 就是把前一百的堆泄露过滤出来。dc 是显示c堆的内容
windows使用: 工具包使用setup.bat安装之后,右键上面解压出来的db.00.NE.dbg.DEC的文件夹就会出现 NE/NK -Analyze菜单功能,之后产生生成sysmbol文件夹,具体操作和上面一样,再次解析,按照命令就可以生成对应的c_leak_txt文件了。
后面解析之后具体使用到的文件就是 c_leak.txt、c_heap.txt、PROCESS_MAPS、PROCESS_MAPS_RAW这几个文件。然后给到开发来分析一下具体的问题就可以了
工具包:包含GAT和SpOfflineDebugSuite 、c_leak.txt、libc.so链接:
链接: https://pan.baidu.com/s/1OzFBzRbsUtsFwy8EXkjkZw 密码: o8d9