ftrace之function及function_graph使用一 用途
(1)function 主要用于跟踪内核函数的调用栈(其被调用过程)
(2)function_graph 主要用于跟踪内核函数内部调用流程及耗时
这两个对内核性能分析的作用不大,主要用来梳理内核模块的逻辑
二 使用
(1)function 使用
/sys/kernel/debug/tracing # echo nop > current_tracer ----清空跟踪器
/sys/kernel/debug/tracing # echo drm_open > set_ftrace_filter ----设置跟踪函数为drm_open
/sys/kernel/debug/tracing # echo function > current_tracer ----设置当前跟踪器
/sys/kernel/debug/tracing # echo 1 > options/func_stack_trace ----跟踪函数调用栈
/sys/kernel/debug/tracing # echo 1 > tracing_on ----开始跟踪
/sys/kernel/debug/tracing # /mnt/vkms_test ---运行vkms_test程序,其会调用到内核drm_open函数
/sys/kernel/debug/tracing # echo 0 > tracing_on ----关闭跟踪
/sys/kernel/debug/tracing # cat trace ----查看跟踪结果
# tracer: function
#
# entries-in-buffer/entries-written: 2/2 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
vkms_test-90 [001] .... 5408.290697: drm_open <-drm_stub_open
vkms_test-90 [001] .... 5408.291126: <stack trace>
=> drm_stub_open
=> chrdev_open
=> do_dentry_open
=> vfs_open
=> path_openat
=> do_filp_open
=> do_sys_openat2
=> do_sys_open
=> sys_open
=> ret_fast_syscall
=> 0xbebc3cdc
/sys/kernel/debug/tracing #
shell脚本:
/mnt # cat trace_fun.sh
# !/bin/sh
if [ $# -lt 2 ]; then
echo "usage:"
echo " sh trace_func.sh function exec_file"
exit -1
fi
cd /sys/kernel/debug/tracing/
echo nop > current_tracer
echo $1 > set_ftrace_filter
echo function > current_tracer
echo 1 > options/func_stack_trace
echo 1 > tracing_on
$2
echo 0 > tracing_on
cat trace
cd -
(2)function_graph使用
/sys/kernel/debug/tracing # echo nop > current_tracer
/sys/kernel/debug/tracing # echo function_graph > current_tracer
/sys/kernel/debug/tracing # echo drm_open > set_graph_function
/sys/kernel/debug/tracing # echo 1 > options/funcgraph-tail ----增加函数尾部注释
/sys/kernel/debug/tracing # echo > set_ftrace_filter ----清空,否则无法显示调用栈
/sys/kernel/debug/tracing # echo 1 > tracing_on
/sys/kernel/debug/tracing # /mnt/vkms_test
/sys/kernel/debug/tracing # echo 0 > tracing_on
/sys/kernel/debug/tracing # cat trace
shell脚本:
/mnt # cat trace_fun_graph.sh
# !/bin/sh
if [ $# -lt 2 ]; then
echo "usage:"
echo " sh trace_func_graph.sh function exec_file"
exit -1
fi
cd /sys/kernel/debug/tracing/
echo nop > current_tracer
echo function_graph > current_tracer
echo $1 > set_graph_function
echo 1 > options/funcgraph-tail
echo > set_ftrace_filter
echo 1 > tracing_on
$2
echo 0 > tracing_on
cat trace
cd -
https://blog.csdn.net/M120674/article/details/122309654