一、Ftrace 是什么?
Ftrace 是 Linux 内核自带的调试工具,从 2.6 版本开始就有。它最初用来追踪函数执行,现在能追踪内核的各种事件。通过 /sys/kernel/debug/tracing 目录下的文件控制。
二、使用 Ftrace 的步骤(以跟踪do_sys_open为例)
选择追踪模式
Ftrace 支持多种模式,常用的是:
function:记录每个函数的调用次数function_graph:显示函数调用的流程图(推荐新手用这个)
设置模式命令:
bash
# 切换到函数流程图模式
sudo sh -c "echo function_graph > /sys/kernel/debug/tracing/current_tracer"1
2
2
指定要追踪的函数
比如要追踪 do_sys_open 函数的调用链:
bash
sudo sh -c "echo do_sys_open > /sys/kernel/debug/tracing/set_graph_function"1
开始追踪
bash
sudo sh -c "echo 1 > /sys/kernel/debug/tracing/tracing_on"1
停止追踪并查看结果
bash
sudo sh -c "echo 0 > /sys/kernel/debug/tracing/tracing_on"
sudo cat /sys/kernel/debug/tracing/trace1
2
2
三、Ftrace 常用操作说明
可选模式有哪些?
查看所有模式:
bash
sudo cat /sys/kernel/debug/tracing/available_tracers
# 输出类似:hwlat blk mmiotrace function_graph ...1
2
2
如何设置要追踪的函数?
set_ftrace_filter:直接记录特定函数的调用(如SyS_epoll_wait)
bash
sudo sh -c "echo SyS_epoll_wait > /sys/kernel/debug/tracing/set_ftrace_filter"1
set_graph_function:追踪函数及其子函数的调用流程(需用function_graph模式)
开关控制
bash
# 开启追踪
echo 1 > /sys/kernel/debug/tracing/tracing_on
# 关闭追踪
echo 0 > /sys/kernel/debug/tracing/tracing_on1
2
3
4
2
3
4
四、trace-cmd:更简单的 Ftrace 工具
常用命令
bash
# 安装(不同系统命令可能不同)
sudo apt-get install trace-cmd # Debian/Ubuntu
sudo dnf install trace-cmd # Fedora
# 基础用法
trace-cmd record -e sched ./your_program # 记录特定事件(如调度事件)
trace-cmd report # 查看结果1
2
3
4
5
6
7
2
3
4
5
6
7
常用选项详解
- 查看支持的事件
bash
trace-cmd list -e
# 或筛选特定事件
trace-cmd list -e sched1
2
3
2
3
- 追踪特定进程
bash
trace-cmd record -p function -o mytrace.dat -P <进程号>1
- 过滤函数
bash
trace-cmd record -e do_sys_open # 仅追踪do_sys_open函数1
- 限制追踪深度
bash
trace-cmd record --graph-max-stack 10 # 限制调用栈深度为10层1
- 追踪特定事件
bash
trace-cmd record -e sched_process_fork # 追踪进程创建事件1
实际使用示例
bash
# 追踪自己运行的程序(比如测试程序test_app)
trace-cmd record -e sched ./test_app
trace-cmd report > trace_result.txt
# 查看CPU调度事件
cat trace_result.txt | grep "schedule:"1
2
3
4
5
6
2
3
4
5
6
五、关键点总结
- Ftrace 通过文件操作控制,trace-cmd 是更友好的命令行工具
function_graph模式适合看函数调用流程- trace-cmd 的
record+report组合能快速开始和分析追踪 - 记得用
sudo权限操作内核文件
如果遇到问题,可以先检查:
- debugfs 是否已挂载(检查
/sys/kernel/debug目录) - 是否有权限问题(确保用 sudo)
- 追踪的函数名是否正确(内核函数名可能带前缀如
SyS_)