目录
使用脚本report_html.py将data转为html文件
背景
在实际的工程中,可以使用simpleperf分析camera gpu内存泄露和GPU内存拆解。一般camera gpu泄露问题总体不太容易定位,在代码层面上,gpu memory的分配和消费涉及到camera app、camera provider和camera server 众多业务逻辑及gpu驱动的memory management。但是如果我们抓住内存分配和回收在内核中的末端接口,从下往上dump 出所有alloc和free的调用,通过对比是可以定位出在哪里出现了alloc但是没有free的情况,也就是可以找到泄漏点,如果能找到泄露点,自然距离解决问题就不远了。
simpleperf简介
为了达成上述的目的,我们需要一个工具可以追踪gpu驱动kgsl 中定义的关于内存的tracepoints,也就是kgsl_mem_alloc、kgsl_mem_free、kgsl_mem_map,使用这个工具dump出所有调用这三个接口的调用,这种工具有很多,但是如果需要带上用户空间的backtrace可选项就少了。介于kgsl有现成的静态tracepoint以及工具易用度,这里选择了simpleperf。
simpleperf 是原linux平台perf的简化android版本,现在已经收录在google source code中,具体的google 官方代码路径为:https://cs.android.com/android/platform/superproject/+/master:system/extras/simpleperf/
Simpleperf是一个命令行工具,它的工具集包涵client端和host端。
-Client端:运行在Android系统上的可执行文件,负责收集性能数据;shell中端中直接使用simpleperf record或者simpleperf report命令。
-Host端:则运行开发机上,负责对数据进行分析和可视化;可以使用脚本report_html.py进行可视化。
Simpleperf还包含其他脚本:
用于记录事件的脚本(脚本或可执行文件均可记录):app_profiler.py、run_simpleperf_without_usb_connection.py
用于报告的脚本:report.py、report_html.py
用于分析 profiling data 的脚本:simpleperf_report_lib.py
Simpleperf使用
将Simpleperf工具的可执行程序 push 到手机上
adb push ~/system/extras/simpleperf/scripts/bin/android/arm64/simpleperf /data/local/tmp
adb shell
chmod
777
/data/local/tmp/simpleperf
启动手机上的被测程序,ps 出该程序的进程ID
adb shell
ps
-A |
grep
"需要分析的应用程序包名"
例如:
- adb shell ps -A|grep camera
- 查询provider_pid_1273
记录运行结果数据perf.data
# -p <进程号>
# --duration <持续的时间(秒为单位)>
# -o <输出文件名称>
# --call-graph dwarf 用在32位系统中,64位则采用--call-graph fp
adb shell simpleperf record -p 11555 --duration 10 -o /sdcard/perf.data --call-graph fp
报告结果数据:将data转为txt
adb shell simpleperf report -i /sdcard/perf.data -o /sdcard/perf.txt
将手机的文件pull到电脑指定路径
adb pull /sdcard/perf.txt ./
adb pull /sdcard/perf.data ./
使用脚本report_html.py将data转为html文件
perf.data是一个文本文件,如果嵌套过深,基本就看不懂了。
可通过其中一个脚本(python report.py -g)启动GUI显示可视化结果。
还可以通过如下转化为HTML文件。
python3 ~/system/extras/simpleperf//report_html.py -i perf.data -o simpleperf.html
下载FlameGraph
https://github.com/brendangregg/FlameGraph.git
# 将FlameGraph下载到指定目录simpleperf-demo,并将simpleperf复制到该目录
git clone https://github.com/brendangregg/FlameGraph.git
chmod 777 FlameGraph/flamegraph.pl
chmod 777 FlameGraph/stackcollapse-perf.pl
cp -r /home/hqb/Android/Sdk/ndk/21.3.6528147/simpleperf /home/mi/simpleperf-demo
生成火焰图
cd /home/mi/simpleperf-demo
python ./simpleperf/report_sample.py > out.perf
./FlameGraph/stackcollapse-perf.pl out.perf >