1. Ftrace 功能描述
1.1 基本原理
trace的核心思想是跟踪记录;
ftrace即linux kernel中实现的一套trace机制,可以记录各个function、event等处理的时长和调用顺序;
基于ftrace,Android拓展为systrace功能记录系统主要事件的处理path(alios 也有类似的atrace);
1.2 用途
- 学习系统功能模块的调用path跟踪;
- 系统各个阶段的耗时情况跟踪优化;
- 对display模块中抖动、丢帧问题排查;
1.3 官方文档
- android:https://source.android.com/devices/tech/debug/ftrace#dftrace
- kernel:https://www.kernel.org/doc/Documentation/trace/ftrace.txt
2. 配置使能
2.1 配置项
CONFIG_IRQSOFF_TRACER=y
CONFIG_PREEMPTIRQ_EVENTS=y
CONFIG_PREEMPT_TRACER=y
CONFIG_SCHED_TRACER=y
CONFIG_HWLAT_TRACER=y
CONFIG_FTRACE_SYSCALLS=y
CONFIG_PROFILE_ALL_BRANCHES=y
CONFIG_STACK_TRACER=y
CONFIG_BLK_DEV_IO_TRACER=y
CONFIG_FUNCTION_PROFILER=y
2.2 配置方法
配置config文件,有两种方式:
- 知道具体添加哪些config,则直接找到对应的config文件,手动写入,然后重新build;
/kernel/arch/arm/configs/***
/kernel/arch/arm64/configs/*** - 通过make menuconfig的方式写入
2.2.1 make menuconfig 配置
第一级选择 kernel hacking:
第二级选择 Tracer:
第三级根据需要选择:
2.3 配置问题记录
一般来说我们实际项目中,都会根据HW资源另写一个config文件,这时候如果直接使用make menuconfig,load对应文件进来修改后save,做git diff对比,会发现整个文件都不大一样了;
对于这种情况:
- 我们的做法是修改后将原来的 .config与生成后 .config做对比,将差异重新写到我们所需要的文件中;
- 或者简单的做法,直接手动修改对应的config文件;
2.4 如何确认修改成功
- 查看build出来的.config文件
- 查看机器内的config文件: adb shell “zcat /proc/config.gz | grep TRACER”
3. 如何使用
打开上述kernel配置后,即已经启用了ftrace的相关配置了,接下来看下简单的用法:
3.1 命令用法
3.1.1 mount(参照官网):
- /etc/fstab file添加:tracefs /sys/kernel/tracing tracefs defaults 0 0
- 在设备上直接mount: mount -t tracefs nodev /sys/kernel/tracing
这里需要强调:上述命令在root条件下进行
否则会提示:mount: bad /etc/fstab: No such file or directory
并且无法再tracing目录下看到结点;
3.1.2 简易命令,首先来看tracing目录下有哪些选项:
- trace:抓取到的文件,可以load到解析工具上作为可视化解析
- tracing_on:打开关闭trace的开关echo 0 关闭 echo 1打开;
- current_tracer:查看当前抓取哪些信息
- available_tracers:支持的tracer
- available_events:支持的events
- set_ftrace_pid:配置需要监测的pid
3.1.3 命令示意:
- 官方示例:
tracefs=
sed -ne 's/^tracefs \(.*\) tracefs.*/\1/p' /proc/mounts
echo nop > $tracefs/tracing/current_tracer
echo 0 > $tracefs/tracing/tracing_on
echo $$ > $tracefs/tracing/set_ftrace_pid
echo function > $tracefs/tracing/current_tracer
echo 1 > t r a c e f s / t r a c i n g / t r a c i n g o n e x e c " tracefs/tracing/tracing_on exec " tracefs/tracing/tracingonexec"@"
- 查看函数调用:
echo function_graph > /sys/kernel/debug/tracing/current_tracer
echo do_one_initcall > /sys/kernel/debug/tracing/set_graph_function
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo 0 > /sys/kernel/debug/tracing/tracing_on
- 查看function
echo function > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo 0 > /sys/kernel/debug/tracing/tracing_on
3.2 如何解析
trace 主要可以用来做两件事情:
- 模块学习时的函数调用过于复杂,查看code跟的云里雾里,则可以通过function-graph来建立脉络
- 分析某个过程的函数耗时
对于ftrace 解析主要看生成的trace数据,可以看到各个函数执行时间以及调用过程;
另外,chrome://tracing/是google推出的可视化解析trace的工具,目前来看无法解析ftrace抓出来的内容;
3.3 systrace
从上述分析我们可以看得到,ftrace是linux kernel中提供的trace机制,应该有上层工具将其利用起来,方便record和解析
则研究下systrace:systrace与ftrace的思想或者原理是一样的,之前主要分析相关的抖动(jitter)、掉帧(jank)问题
- 通过android studio ddms抓取查看
- 通过eclipse ddms抓取查看
- 通过python脚本抓取(需要2.7 version),chrome浏览器查看(个人比较喜欢,轻量级一些)
ps : systrace.py在platform-tool中提供,安装android开发工具都会有;
3.3.1 录制:
3.3.2 解析(这只是随便抓取了些数据,没有实际问题分析):
3.3.3 systrace.py调用过程中遇到的问题
不同机器上使用systrace会遇到组件未安装完成的情况:
-
如果提示组件未找到(缺啥安装啥):
- python -m pip install pypiwin32
- python -m pip install six
-
提示编码问题(unknow encoding:cp65001):
如何解决:chcp 1252 -
提示ssl 验签错误:
如何解决:python -m pip --trusted-host pypi.python.org install <包名>
4. 附录
4.1 available tracer
可以看到,其实就是我们在config文件中的配置项
function_graph irqsoff function nop
4.2 available event
raw_syscalls:sys_exit
raw_syscalls:sys_enter
syscalls:sys_exit_arm64_personality
syscalls:sys_enter_arm64_personality
…