一、基本用法
sudo su
cd /sys/kernel/debug/tracing/
echo function > current_tracer
备注: 其中 function 是系统支持的一种类型,查看所有的类型
cat available_tracers
echo 1 > tracing_on
// 等待一小会
echo 0 > tracing_on
cat trace | head -20
以上是基本用法,接下来是进阶用法:
二、进阶用法
2.1 跟踪的函数
set_ftrace_filter 表示要跟踪的函数,dev_attr_show 要根据具体哪个函数
echo dev_attr_show > set_ftrace_filter
2.2 查看函数调用栈
函数内部添加
WARN_ON(1)
终端窗口
echo 1 > options/func_stack_trace
2.3 跟踪执行时间短的命令
ftrace 过滤控制相关文件:
set_ftrace_filter function tracer 只跟踪某个函数
set_ftrace_notrace function tracer 不跟踪某个函数
set_graph_function function_graph tracer 只跟踪某个函数
set_graph_notrace function_graph tracer 不跟踪某个函数
set_event_pid trace event 只跟踪某个进程
set_ftrace_pid function/function_graph tracer 只跟踪某个进程
调试 kill 的内核执行流程,如何办呢?
因为 kill 运行时间很短,我们不能知道它的 pid,所以就没法过滤了。
可以使用如下脚本:
sh -c "echo $$ > set_ftrace_pid; echo 1 > tracing_on; kill xxx; echo 0 > tracing_on"
2.4 如何跟踪过滤多个进程?多个函数?
-
函数名相同的用法
# echo 'dev_attr_*' > set_ftrace_filter
# cat set_ftrace_filter
dev_attr_store
dev_attr_show
- 在上面的基础上追加函数
ip_rcv
# echo ip_rcv >> set_ftrace_filter
# cat set_ftrace_filter
dev_attr_store
dev_attr_show
ip_rcv
- 模块过滤
格式为:<function>:<command>:<parameter>,例如,过滤 ext3 module 的 write* 函数:
$ echo 'write*:mod:ext3' > set_ftrace_filter
-
从过滤列表中删除某个函数
感叹号用来移除某个函数,把上面追加的 ip_rcv 去掉:
# cd /sys/kernel/debug/tracing
# cat set_ftrace_filter
dev_attr_store
dev_attr_show
ip_rcv
# echo '!ip_rcv' >> set_ftrace_filter
# cat set_ftrace_filter
dev_attr_store
dev_attr_show