支持作者,点击京东购买作者创作书籍《Yocto项目实战教程:高效定制嵌入式Linux系统》
作者:嵌入式 Jerry
适用对象:Linux 驱动开发者 / BSP 经验积累者 / Yocto 开发环境下的内核调试需求者
一、ftrace 是什么?
ftrace
是 Linux 内核内置的函数级跟踪工具链,允许我们无需改动代码,即可在运行时动态观察内核中的函数调用、事件执行、互斥进入和优先级切换等具体行为。
ftrace 核心特点是:
- 基于 debugfs
- 基于 mcount/动态跳转
- 无需修改代码
- 可分析函数调用路径和耗时
- 支持事件级 tracepoint hook
二、基本进入与 debugfs 环境
先确认内核配置启用了 ftrace 支持:
zcat /proc/config.gz | grep CONFIG_FTRACE
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
挂载 debugfs:
mount -t debugfs none /sys/kernel/debug
为方便,建议组合使用:
cd /sys/kernel/debug/tracing
根目录里有许多关键控制文件:
文件 | 作用 |
---|---|
trace | 显示最新一段 trace 记录 |
available_filter_functions | 可设置过滤的全部函数名 |
set_ftrace_filter | 指定需跟踪的函数 |
current_tracer | 设置跟踪类型 (如 function, graph) |
tracing_on | 1/启用, 0/停止 trace 记录 |
三、实战需求场景:根据问题查询实际函数
场景: i.MX8MP 平台上,USB 设备无响应,用 dmesg 和 printk 无法确定是否调用了 usb_add_hcd()
和 usb_create_hcd()
目标: 无需修改内核,监控调用流程
四、实操步骤:Function Tracer
4.1 选择跟踪器
echo function > current_tracer
4.2 设置过滤函数
echo usb_add_hcd > set_ftrace_filter
echo usb_create_hcd >> set_ftrace_filter
4.3 清空记录 & 启动 tracing
echo > trace
echo 1 > tracing_on
此时提供 USB 设备,触发 probe
4.4 停止 tracing & 查看 trace
echo 0 > tracing_on
cat trace
输出示例:
usbhcd_probe()
usb_create_hcd()
usb_add_hcd()
五、function_graph 深层分析
切换跟踪器:
echo function_graph > current_tracer
echo usb_add_hcd > set_graph_function
输出示例:
usb_add_hcd() {
usb_get_hcd()
usb_alloc_dev()
...
} = 432.34 us
可直接分析耗时和子调用链
六、应用分析和扩展
需求 | 推荐 tracer | 调用评估 |
---|---|---|
确认函数是否被调用 | function | set_ftrace_filter + trace |
分析调用链和耗时 | function_graph | set_graph_function + trace |
调试启动时间过长问题 | initcall_debug + ftrace | trace_initcall_level + timing |
七、总结:你不需要写代码,ftrace 已经做好了全部
- 只需操作 debugfs 中的几个文件
- 可监控任意函数
- 适合 BSP 分析 / 动态 probe 确认 / 急难应急
- 配合 trace-cmd / kernelshark 可进一步可视化
Part 2 (下篇):将讲解如何通过 trace_printk()
和 trace_event 在驱动中为 ftrace 添加个性化记录,完成一条从 “需求打点” 到 “ftrace 查询” 的专用跟踪链。
支持作者,点击京东购买作者创作书籍《Yocto项目实战教程:高效定制嵌入式Linux系统》