ftrace是一个功能强大的Linux内核跟踪工具,可用于分析内核的行为和性能问题。它可以用来收集各种内核跟踪数据,如函数调用、内存分配、中断处理等。以下是ftrace的一些主要特点和用法:
ftrace是内核自带的跟踪工具,因此无需安装。要启用ftrace,需要在内核编译时启用CONFIG_FUNCTION_TRACER配置选项。可以使用以下命令检查内核是否支持ftrace:
cat /boot/config-$(uname -r) | grep CONFIG_FUNCTION_TRACE
如果输出结果包含"=y"或"=m",则表示内核支持ftrace。
在/sys/kernel/debug/tracing目录下提供了各种跟踪器和事件:
可用的ftrace跟踪器:
使用方法:
cd /sys/kernel/debug/tracing
/* 关闭function-trace可用减少一些延迟:echo 0 > options/function-trace可以设置要跟踪的进程:cat set_ftrace_pid 查看当前指定跟踪的进程echo 进程的PID > set_ftrace_pid 指定要跟踪的进程cat set_ftrace_pid 查看是否指定成功
*/
echo 跟踪器 > current_tracer
echo 1 > tracing_on
// ...等待一会
echo 0 > tracing_on
cat trace
动态ftrace:
若在配置内核时打开了CONFIG_DYNAMIC_FTRACE选项,就可以使用动态ftrace功能
set_ftrace_filter:设置要跟踪的 函数
set_ftrace_notrace:指定不要跟踪的函数
available_filter_functions 文件可以列出当前系统支持的所有函数
“>”表示覆盖过滤器的内容,“>>”表示把新函数添加到过滤器中,但不会覆盖
eg:通过以下代码可以只关注sys_nanosleep()和hrtimer_interrupt()这两个函数:
cd /sys/kernel/debug/tracing
echo sys_nanosleep hrtimer_interrupt > set_ftrace_filter
echo function > current_tracer
echo 1 > tracing_on
usleep 1
echo 0 > tracing_on
cat trace
事件跟踪:
要在available_events文件中查找该跟踪点是否存在,然后把想要跟踪的事件添加到set_event文件中即可。eg:
cd /sys/kernel/debug/tracing
cat available_events | grep sched_stat_runtime // 查询系统是否支持跟踪点
echo sched:sched_stat_runtime > set_event // 跟踪找个事件
echo function > current_tracer
echo 1 > tracing_on
// ...等待一会
echo 0 > tracing_on
cat trace
可以使用类似于C语言的表达式对事件进行过滤,对于数字域支持“==、!=、<、<=、>、>=、&
”操作符,对于字符串域支持“==、!=、~
”操作符。eg:
cd /sys/kernel/debug/tracing/events/sched/sched_stat_runtime
echo 'comm ~ "sh*"' > filter //跟踪以sh开头的所有进程
echo 'pid == 725' > filter //跟踪进程PID为725的进程