HACK#71 将动态追踪事件添加到内核中

本节使用ftrace和perf probe,将动态追踪事件添加到内核中。

Hack#69介绍了使用ftrace记录追踪事件的方法。本节将介绍使用Linux 2.6.33开始添加的新结构“动态追踪事件”,简单方便地添加追踪事件的方法。

动态追踪事件

从Linux 2.6.33开始,ftrace和perf tools中开始添加了使用kprobes的动态追踪事件功能。通过使用这个功能,就可以在内核运行过程中添加新的追踪事件。这个功能的优点在于即使添加追踪事件也不需要重新构建或者重新启动内核。另外,通过使用perf tools的probe子命令,还可以添加源代码层次的追踪事件。可以看做是调试程序(debugger)的断点(break point)这样的功能。在动态追踪事件中还可以获取寄存器或栈的值(进而获取相应的内存值)。

动态追踪事件与其他内核内部事先定义的追踪事件一样,可以针对每个定义的事件进行启用或过滤。还可以使用perf probe,在源代码层次指定事件发生位置、从事件获取的本地变量、结构成员等。

如上所述,动态追踪事件是非常便利的功能,但是也受到一些约束。首先,内核中也有一部分无法添加追踪事件的区域。对于NMI、异常、kprobes的相关代码,无法添加追踪事件(这是kprobes的约束)。其次,动态追踪事件并不改写磁盘上的内核映像文件,因此只要重启系统就会消失。每次启动时都要添加相同事件的情况下,就需要将动态追踪事件的定义另行保存。虽然如此,但有了perf tools的帮助,就可以很轻松地添加动态追踪事件。寻找内核的bug时也是非常有用的工具。