ubuntu 使用 ftrace 指南

一、基本用法

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 如何跟踪过滤多个进程?多个函数?

  1. 函数名相同的用法

 
 

# echo 'dev_attr_*' > set_ftrace_filter

# cat set_ftrace_filter

dev_attr_store

dev_attr_show

  1. 在上面的基础上追加函数 ip_rcv
 
 

# echo ip_rcv >> set_ftrace_filter

# cat set_ftrace_filter

dev_attr_store

dev_attr_show

ip_rcv

  1. 模块过滤

格式为:<function>:<command>:<parameter>,例如,过滤 ext3 module 的 write* 函数:

 
 

$ echo 'write*:mod:ext3' > set_ftrace_filter

  1. 从过滤列表中删除某个函数

感叹号用来移除某个函数,把上面追加的 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

猜你喜欢

转载自blog.csdn.net/hfut_zhanghu/article/details/123229802