记录:Ftrace/systrace 功能使用

1. Ftrace 功能描述

1.1 基本原理

trace的核心思想是跟踪记录;
ftrace即linux kernel中实现的一套trace机制,可以记录各个function、event等处理的时长和调用顺序;
基于ftrace,Android拓展为systrace功能记录系统主要事件的处理path(alios 也有类似的atrace);

1.2 用途

  1. 学习系统功能模块的调用path跟踪;
  2. 系统各个阶段的耗时情况跟踪优化;
  3. 对display模块中抖动、丢帧问题排查;

1.3 官方文档

  1. android:https://source.android.com/devices/tech/debug/ftrace#dftrace
  2. 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文件,有两种方式:

  1. 知道具体添加哪些config,则直接找到对应的config文件,手动写入,然后重新build;
    /kernel/arch/arm/configs/***
    /kernel/arch/arm64/configs/***
  2. 通过make menuconfig的方式写入
2.2.1 make menuconfig 配置

第一级选择 kernel hacking:
kernel haking
第二级选择 Tracer:
tracer

第三级根据需要选择:
all

2.3 配置问题记录

一般来说我们实际项目中,都会根据HW资源另写一个config文件,这时候如果直接使用make menuconfig,load对应文件进来修改后save,做git diff对比,会发现整个文件都不大一样了;

对于这种情况:

  1. 我们的做法是修改后将原来的 .config与生成后 .config做对比,将差异重新写到我们所需要的文件中;
  2. 或者简单的做法,直接手动修改对应的config文件;

2.4 如何确认修改成功

  1. 查看build出来的.config文件
  2. 查看机器内的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目录下有哪些选项:

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)问题

  1. 通过android studio ddms抓取查看
  2. 通过eclipse ddms抓取查看
  3. 通过python脚本抓取(需要2.7 version),chrome浏览器查看(个人比较喜欢,轻量级一些)
    ps : systrace.py在platform-tool中提供,安装android开发工具都会有;
3.3.1 录制:

在这里插入图片描述

3.3.2 解析(这只是随便抓取了些数据,没有实际问题分析):

在这里插入图片描述

3.3.3 systrace.py调用过程中遇到的问题

不同机器上使用systrace会遇到组件未安装完成的情况:

  1. 如果提示组件未找到(缺啥安装啥):

    • python -m pip install pypiwin32
    • python -m pip install six
  2. 提示编码问题(unknow encoding:cp65001):
    在这里插入图片描述
    如何解决:chcp 1252

  3. 提示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


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值