ftrace 是内建于 Linux 内核的跟踪工具,从 2.6.27 开始加入主流内核。使用 ftrace 能够调试或者分析内核中发生的事情。ftrace 提供了不一样的跟踪器,以用于不一样的场合,好比跟踪内核函数调用、对上下文切换进行跟踪、查看中断被关闭的时长、跟踪内核态中的延迟以及性能问题等。系统开发人员可使用 ftrace 对内核进行跟踪调试,以找到内核中出现的问题的根源,方便对其进行修复。另外,对内核感兴趣的读者还能够经过 ftrace 来观察内核中发生的活动,了解内核的工做机制。 linux
使用 ftrace ,首先要将其编译进内核。内核源码目录下的 kernel/trace/Makefile 文件给出了 ftrace 相关的编译选项。 框架
CONFIG_FUNCTION_TRACER CONFIG_FUNCTION_GRAPH_TRACER CONFIG_CONTEXT_SWITCH_TRACER CONFIG_NOP_TRACER CONFIG_SCHED_TRACER ... |
ftrace 相关的配置选项比较多,针对不一样的跟踪器有各自对应的配置选项。不一样的选项有不一样的依赖关系,内核源码目录下的 kernel/trace/Kconfig 文件描述了这些依赖关系。读者能够参考 Makefile 文件和 Konfig 文件,而后选中本身所须要的跟踪器。 jsp
一般在配置内核时,使用 make menuconfig 会更直观一些。以 2.6.33.1 版本的内核为例,要将 ftrace 编译进内核,能够选中 Kernel hacking (图 1 )下的 Tracers 菜单项(图 2 )。 函数
进入 Tracers 菜单下,能够看到内核支持的跟踪器列表。如图 3 所示,这里选中了全部的跟踪器,读者能够根据本身的须要选中特定的跟踪器。 工具
这里要注意,若是是在 32 位 x86 机器上,编译时不要选中 General setup 菜单项(图 4 )下的 Optimize for size 选项(图 5 ),不然就没法看到图 3 中的 Kernel Function Graph Tracer 选项。这是由于在 Konfig 文件中,针对 32 位 x86 机器,表项 FUNCTION_GRAPH_TRACER 有一个特殊的依赖条件: 性能
depends on !X86_32 || !CC_OPTIMIZE_FOR_SIZE |
ftrace 经过 debugfs 向用户态提供了访问接口,因此还须要将 debugfs 编译进内核。激活对 debugfs 的支持,能够直接编辑内核配置文件 .config ,设置 CONFIG_DEBUG_FS=y ;或者在 make menuconfig 时到 Kernel hacking 菜单下选中对 debugfs 文件系统的支持,如图 6 所示。 测试
配置完成后,编译安装新内核,而后启动到新内核。 注意,激活 ftrace 支持后,编译内核时会使用编译器的 -pg 选项,这是在 kernel/trace/Makefile 文件中定义的,如清单 2 所示。
ifdef CONFIG_FUNCTION_TRACER ORIG_CFLAGS := $(KBUILD_CFLAGS) KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS)) ... endif ... |
使用 -pg 选项会在编译获得的内核映像中加入大量的调试信息。通常状况下,只是在开发测试阶段激活 ftrace 支持,以调试内核,修复 bug 。最终用于发行版的内核则会关闭 -pg 选项,也就没法使用 ftrace。
ftrace 经过 debugfs 向用户态提供访问接口。配置内核时激活 debugfs 后会建立目录 /sys/kernel/debug ,debugfs 文件系统就是挂载到该目录。要挂载该目录,须要将以下内容添加到 /etc/fstab 文件:
debugfs /sys/kernel/debug debugfs defaults 0 0 |
或者能够在运行时挂载:
mount -t debugfs nodev /sys/kernel/debug |
激活内核对 ftrace 的支持后会在 debugfs 下建立一个 tracing 目录 /sys/kernel/debug/tracing 。该目录下包含了 ftrace 的控制和输出文件,如图 7 所示。根据编译内核时针对 ftrace 的设定不一样,该目录下实际显示的文件和目录与这里也会不一样。
/sys/kernel/debug/trace 目录下文件和目录比较多,有些是各类跟踪器共享使用的,有些是特定于某个跟踪器使用的。在操做这些数据文件时,一般使用 echo 命令来修改其值,也能够在程序中经过文件读写相关的函数来操做这些文件的值。下面只对部分文件进行描述,读者能够参考内核源码包中 Documentation/trace 目录下的文档以及 kernel/trace 下的源文件以了解其他文件的用途。
ftrace 当前包含多个跟踪器,用于跟踪不一样类型的信息,好比进程调度、中断关闭等。能够查看文件 available_tracers 获取内核当前支持的跟踪器列表。在编译内核时,也能够看到内核支持的跟踪器对应的选项,如以前图 3 所示。
ftrace 还支持其它一些跟踪器,好比 initcall、ksym_tracer、mmiotrace、sysprof 等。ftrace 框架支持扩展添加新的跟踪器。读者能够参考内核源码包中 Documentation/trace 目录下的文档以及 kernel/trace 下的源文件,以了解其它跟踪器的用途和如何添加新的跟踪器。
本系列文章对 ftrace 的配置和使用进行了介绍。本文是其中的第一部分,介绍了 ftrace 的编译配置、用户态访问 ftrace 的接口和 ftrace 的数据文件,并对 ftrace 所提供的部分跟踪器的用途进行了描述。因为篇幅的限制,本文没有对 ftrace 的具体使用和如何在代码中与 ftrace 进行交互进行描述,这些内容将分别在本系列文章的后续篇章中给出。