HACK#68 ftrace的插件追踪器
本节介绍如何使用ftrace的插件追踪器进行内核的追踪。
ftrace中有很多插件追踪器。这里介绍一些可用于内核调整或开发的追踪器,如进程调度程序和中断处理延迟的追踪、函数调用和栈使用情况的概要分析。
获取函数的调用关系
想要调查内核中特定部位的运行情况时,使用较多的是函数指针,有时会难以追踪源代码。在这种情况下,使用ftrace的函数调用图表追踪器和回溯追踪器可以更高效地研究调用的起点。
函数调用图表追踪器通过向current_tracer写入function_graph来运行。在这个追踪器中将体现Hack#67中介绍的set_ftrace_filter的设置,因此可以进行限定在一部分函数的追踪上。下面所示为仅追踪ext4文件系统的驱动程序内部的结果。
各行开头的数字表示CPU编号。TIME的位置显示的是执行该函数所花费的时间。以微秒为单位显示,超过10微秒的数值前面会显示‘+’,超过100微秒的数值前面显示‘!’。另外,函数名称按照函数调用的形式显示,使用缩进和大括号更为清晰地显示出调用关系。
另一方面,函数回溯是ftrace自身的扩展功能之一。需要运行事件追踪或函数追踪器,同时向options/func_stack_trace写入1来启动。这个功能在每次调用对象函数时进行回溯,因此需要事先使用set_ftrace_filter来缩小对象函数的范围。
[tracing]#echo schedule>set_ftrace_flter
[tracing]#echo function>current_tracer
[tracing]#echo 1>options/func_stack_trace
[tracing]#echo 0>trace
[tracing]#head-n 20 trace
tracer:function
#
TASK-PID CPU#TIMESTAMP FUNCTION
对象函数的追踪入口后面出现了<stack trace>入口,它的后面显示的是回溯的结果。