echo 0 > tracing_on
echo nop > current_tracer
echo > trace
追踪 pid = 411870 的任务:
echo 411870 > set_ftrace_pid
echo function > current_tracer
echo 1 > tracing_on
cat trace | more
二、Ftrace function_graph
2.1 Graph Tracing
此跟踪器类似于函数跟踪器,只是它在函数的入口和出口处探测函数。 这是通过在每个 task_struct 中使用动态分配的返回地址堆栈来完成的。 在函数进入时,跟踪器会覆盖每个跟踪函数的返回地址以设置自定义探针。 因此原始返回地址存储在task_struct中的返回地址堆栈中。
在函数的两端进行探测会导致特殊功能,例如:
(1)衡量函数执行时间。
(2)有一个可靠的调用栈来绘制函数调用图。
这个跟踪器在以下几种情况下是有用的:
(1)想找到内核异常行为的原因,需要详细了解在任何区域(或特定区域)发生了什么。
(2)正在经历不寻常的延迟,但很难找到它的起源。
(3)快速找到特定功能所采用的路径
(4)查看运行中的内核,看看那里发生了什么。
有几列可以动态启用/禁用。 您可以根据需要使用所需的每种选项组合:
function_graph 跟踪器打印函数的调用图,展示其代码流。
只跟踪一个函数及其所有子函数,将其名称echo 到 set_graph_function 中:
echo do_nanosleep > set_graph_function
下面使用 do_nanosleep() 函数上的 function_graph 跟踪器来显示其子函数调用:
echo do_nanosleep > set_graph_function
echo function_graph > current_tracer
echo nop > current_tracer
echo > set_graph_function
输出显示子调用和代码流:do_nanosleep() 调用 hrtimer_start_range_ns().左侧的列显示了 CPU(在此输出中,主要是 CPU 3)和函数的持续时间,以便可以识别延迟.高延迟包括一个字符符号以帮助您注意它们,在此输出中,延迟为 1000337 微秒(1.0 秒)旁边的“$”。
$: Greater than 1 second
@: Greater than 100 ms
\*: Greater than 10 ms
#: Greater than 1 ms
!: Greater than 100 μs
+: Greater than 10 μs
这个例子特意没有设置函数过滤器(set_ftrace_filter),这样所有子调用都可以看到。 但是,这确实会产生一些开销,从而夸大了报告的持续时间。 它通常对于定位高延迟的来源仍然很有用,这会使增加的开销相形见绌。 当您希望给定函数的时间更准确时,可以使用函数过滤器来减少跟踪的函数。 例如,仅跟踪 do_nanosleep():
echo do_nanosleep > set_ftrace_filter
以 do_sys_open 函数为例子来测试function_graph:
echo do_sys_open > set_graph_function
echo function_graph > current_tracer
echo funcgraph-proc > trace_options
CPU 字段给出了执行函数的 CPU 号,本例中为2 号 CPU
TASK/PID 地段给出进程名称和进程PID号
DURATION 字段给出了函数执行的时间长度,以 us 为单位。
FUNCTION CALLS 则给出了调用的函数,并显示了调用流程。
需要注意:
对于不调用其它函数的函数,其对应行以“;”结尾,而且对应的 DURATION 字段给出其运行时长;
对于调用其它函数的函数,则在其“}”对应行给出了运行时长,该时间是一个累加值,包括了其内部调用的函数的执行时长。DURATION 字段给出的时长并不是精确的,它还包含了执行 ftrace 自身的代码所耗费的时间,所以示例中将内部函数时长累加得到的结果会与对应的外围调用函数的执行时长并不一致;不过通过该字段还是可以大致了解函数在时间上的运行开销的。
备注:function graph trace 实际是在要跟踪函数的入口处和返回处分别放置了钩子函数,在要跟踪函数的入口处插入钩子函数ftrace_caller,在要跟踪函数的返回处插入钩子函数return_to_handler。因此function_graph tracer即可以跟踪到函数的入口还可以跟踪到函数的返回
2.2 Options
选项可用于更改输出,可以在选项options目录中列出:
ls options/funcgraph-\*
这些调整输出并且可以包括或排除详细信息,例如 CPU ID (funcgraph-cpu)、进程名称 (funcgraph-proc)、函数持续时间 (funcgraph-duration) 和延迟标记 (funcgraph-overhead)。
(1)
执行函数的 CPU 编号默认启用。 有时最好只跟踪一个 cpu,或者您有时可能会在 cpu 跟踪切换时看到无序的函数调用。
hide: echo nofuncgraph-cpu > trace_options
show: echo funcgraph-cpu > trace_options
(2)
持续时间(函数的执行时间)显示在函数的右括号行上,或者在叶子函数的情况下显示在与当前函数相同的行上。 它是默认启用的。
hide: echo