xhci trace 开机启动设置

背景

最近遇到一个客户问题,工厂抽检每次都出现,不解决就要停产了,但在客户研发环境无法复现,在工厂环境才能一天复现一次。这是一个老大难问题了,涉及到一些逻辑上的风险,需要联合解决。逻辑需要了解 xhci 控制器的行为和相关的数据包,这就要抓取出问题时候的 trace 和 USB 协议包了。环境在工厂能抓的只有 trace 了,不过也是能进行初步分析的。

关于 trace

trace 是 linux 调试方法之一,可以理解为一种高级打印机制,实现追踪 kernel 中函数事件的框架,源码位于 /kernel/trace/trace.c 。关于 xhci 的 trace 大部分已经在 linux 4.14 版本集成了,linux 4.9 等之前的版本则需要自行移植。

1、开启 trace,make menuconfig 进入配置选项

​ 在 kernel hacking –> trace 中

2、trace 依赖 debugfs,所以挂载 debugfs 到 /sys/kernel/debug/ 。

1
mount -t debugfs none /sys/kernel/debug

3、设置缓存大小,trace 初始的缓存很小,抓 USB 根本不够用

1
echo 20480 > /sys/kernel/debug/tracing/buffer_size_kb

4、使能 xhci event trace

1
echo 1 > /sys/kernel/debug/tracing/events/xhci-hcd/enable

5、使能 trace (总开关)

1
echo 1 > /sys/kernel/debug/tracing/tracing_on

6、导出 trace

1
cat /sys/kernel/debug/tracing/trace > /data/trace.log

问题

问题来了,工厂那边不能做过于复杂的操作,不能敲太多条指令才开启 trace,要求开机就自启动。

开机启动,第一时间是想到 init.rc,海思平台是 init.bigfish.rc 。

1
2
3
4
write /sys/kernel/debug/tracing/buffer_size_kb 20480
write /sys/kernel/debug/tracing/trace ""
write /sys/kernel/debug/tracing/events/xhci-hcd/enable 1
write /sys/kernel/debug/tracing/tracing_on 1

修改 –> 编译 –> 烧入 –> 开机 –> 插入U盘 –> cat trace ,发现并没有内容。于是 cat 每个配置项,发现 /sys/kernel/debug/tracing/events/xhci-hcd/enable 值是 0 。查看 log,报错误,提示没权限。于是 chmod 644 /sys/kernel/debug/tracing/events/xhci-hcd/enable,错误消失了,但还是失败了。仔细一想 init 应该是 root 用户,怎么会没权限呢?难道是 enable 还没生成?还是别的进程把它又改成 0 了?

后续尝试用脚本的形式,在系统启动完后再执行,又遇到了 SELinux 权限的问题,咨询相关同事后也放弃了,同事表示, SELinux 加强权限之后就放弃开启跑脚本了,权限设置不过来,让我另谋出路。

经过多次挣扎,终于在 kernel 文档 Event Tracing 2.3 Boot option 中看到了曙光!只要在 bootargs 中增加 trace_event 就可以开机启动了。

1
trace_event=xhci-hcd

本文部分内容摘自 【jscese】 的博客!

封面来自 windtrace 的花瓣


xhci trace 开机启动设置
http://xxxdk.xyz/xxx/2020/01/xhci-trace-开机启动设置/
作者
sni
发布于
2020年1月9日
许可协议