HACK#68 ftrace的插件追踪器

本节介绍如何使用ftrace的插件追踪器进行内核的追踪。

ftrace中有很多插件追踪器。这里介绍一些可用于内核调整或开发的追踪器,如进程调度程序和中断处理延迟的追踪、函数调用和栈使用情况的概要分析。

获取函数的调用关系

想要调查内核中特定部位的运行情况时,使用较多的是函数指针,有时会难以追踪源代码。在这种情况下,使用ftrace的函数调用图表追踪器和回溯追踪器可以更高效地研究调用的起点。

函数调用图表追踪器通过向current_tracer写入function_graph来运行。在这个追踪器中将体现Hack#67中介绍的set_ftrace_filter的设置,因此可以进行限定在一部分函数的追踪上。下面所示为仅追踪ext4文件系统的驱动程序内部的结果。

HACK#68 ftrace的插件追踪器 - 图1

各行开头的数字表示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


HACK#68 ftrace的插件追踪器 - 图2

对象函数的追踪入口后面出现了<stack trace>入口,它的后面显示的是回溯的结果。