ftrace的使用
这章我们先来看看如何使用ftrace。
说来惭愧,多少年前同事告诉我这种高级方法的时候,我还觉得麻烦,依然在使用printk。现在回想起来真实井底之蛙啊。
有几个非常不错的参考资料:
内核源码中的使用手册
接下来就从来看几个例子:
Tracing测试文件目录
要和trace打交道都是要通过它的debugfs接口,默认情况下这个文件目录在 /sys/kernel/debug/tracing.
你也可以手动挂载到想要的位置:
在这个目录下有很多重要的文件,具体每个文件的作用可以在使用手册中找到。这里解说几个比较重要的
设置当前使用的tracer
current_tracer
available_tracer
是否过滤函数
available_filter_functions
set_ftrace_filter
set_graph_function
得到trace输出
trace
per_cpu/cpu0/trace
trace_pipe
控制是否将跟踪输出写入
tracing_on
像我这样的初级小白,了解这么几个文件就够用了。
使用function tracer
先来看一个完整的使用方法。
tracing_on用来控制是否实际输出到trace文件,所以我们在开始和结束时,我们都关掉输出,以免有太多的输出内容。 第二个命令用来指定这次使用的是function trace。因为没有设置函数过滤,所以应该是所有的内核函数都会被记录。 打开输出,停一会儿再关掉后,就可以通过trace文件查看这段时间内的内核运行情况了。
另外还可以通过查看per_cpu/cpu0/trace文件来只观察在cpu0上发生的内核函数调用。这是一个非常不错去除多个cpu之间干扰的好方法。
使用function_graph tracer
这个例子和之前的区别在于选择了不同的tracer,function_graph的话可以打印出函数调用的关系,更加方便理解。
也就不做过多的解释。
使用trace_printk()
这个函数的用法和printk()一样,只是输出不在console,而是在ftrace的ring buffer。
而且在nop tracer的情况下也能在trace中看到输出。这样就不会被函数调用信息干扰到了。
汗颜,现在才知道这个。
使用function command
这个用法来自作者的第三篇文章Secrets of the Ftrace function tracer。因为trace的内容太多,这个方法能够在某个函数被调用时停止trace,方便调试时观察到trace信息。
方法如下
这样就可以在函数__bad_area_nosemaphore触发时,停止trace,留住最后的案发现场。
现实谁调用了某个函数
在学习内核的过程中,我们有时候会想了解一下一个函数都会被谁调用,整个调用栈是什么样子的。ftrace也提供了这个功能。
Profiling
Ftrace也能做profile。
没实验成功,以后再看看。
Last updated