本文参考了一些博客,然后在自己的主机(Ubuntu 18.04)上进行了测试
在Linux内核文档中有关于ftrace的介绍:
https://www.kernel.org/doc/Documentation/trace/ftrace.txt
ftrace是一个Linux内部跟踪器,主要是帮助系统的开发人员和设计人员了解到内核中发生了的事情。
它可用于调试或分析在用户空间之外发生的延迟和性能问题。虽然ftrace通常被认为是函数跟踪器,但它实际上是几个各种跟踪实用程序的框架工作。有延迟跟踪来检查禁用和启用的中断之间发生的情况,以及抢占和从任务被唤醒到任务实际安排的时间
ftrace最常见的用途之一是事件跟踪。通过内核可以通过tracefs文件系统启用数百个静态事件点,以查看内核某些部分的情况。
现在以我的一台主机测试 ftrace 的使用。
在各种Linux发行版中基本都已经提供了对 ftrace 的支持,在我的Ubuntu中,相关内容在如下目录中:
/sys/kernel/debug/tracing
该目录下的内容如下:
在该目录中,我们可以通过查看 available_tracers 文件,获取当前内核支持的跟踪器列表:
cat available_tracers
Tracer有很多种,主要几大类:
来源:http://www.cnblogs.com/arnoldlu/p/7211249.html
在本文中,主要使用 function 以及 function_graph 这两个跟踪器。
使用如下命令来使用 function 跟踪器:
echo function > current_tracer
相当于把当前的跟踪器,配置为 function,我们可以使用 cat 命令查看当前的 current_tracer
从上图中可以看到,我们配置 function 成功。
配置好之久, ftrace 就开始工作了,会将相关的 trace 信息放到 trace 文件里面,直接读取这个文件就能获取相关的信息。
cat trace | head -n 20
如果直接 cat trace 文件,内容就太多了,我们可以通过文件 set_ftrace_filter 指定要跟踪的函数,缺省目标为所有可跟踪的内核函数;可以将感兴趣的函数通过 echo 写入该文件。
为了方便使用,set_ftrace_filter 文件还支持简单格式的通配符。
需要注意的是,这三种形式不能组合使用,比如“begin*middle*end”实际的效果与“begin”相同。另外,使用通配符表达式时,需要用单引号将其括起来,如果使用双引号,shell 可能会对字符‘ * ’进行扩展,这样最终跟踪的对象可能与目标函数不一样。
通过该文件还可以指定属于特定模块的函数,这要用到 mod 指令。指定模块的格式为:
echo ':mod:[module_name]' > set_ftrace_filter
来源:https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace2/index.html
例如我要查看与schedule相关的内容,那么可以使用如下命令将要输出的写入到 set_ftrace_filter文件中:
echo schedule > set_ftrace_filter
然后再使用cat trace命令查看trace:
cat trace | head -n 20
如果不想要trace schedule 这个函数,也可以这样做:
echo '!schedule' > set_ftrace_filter
或者也可以这样做:
echo schedule > set_ftrace_notrace
Function_ Graph比function能够更加详细地打印出函数调用上下文。
function_graph 跟踪器则可以提供类似 C 代码的函数调用关系信息。通过写文件 set_graph_function 可以显示指定要生成调用关系的函数,缺省会对所有可跟踪的内核函数生成函数调用关系图。
设置为 function graph
echo function_graph > current_tracer
打印出 trace:
cat trace | head -n 20
我们也可以只跟踪某一个函数的堆栈,例如open:
echo kfree > set_graph_function
打印出 trace:
cat trace | head -n 20
1. 《使用 ftrace 来跟踪系统问题 - ftrace 介绍》
地址:https://www.jianshu.com/p/99e127973abe
主要是ftrace的使用方法
2. 《Linux ftrace框架介绍及运用》
地址:http://www.cnblogs.com/arnoldlu/p/7211249.html
讲解了ftrace的源码,在这篇博客中也给出了一些参考的内容
ftrace的帮助文档在Documentation/trace,ftrace代码主要在kernel/trace,ftrace相关头文件在include/trace中。
WiKiPedia有关于ftrace的简单介绍。
ftrace的作者在LinuxCon 2010有一篇关于Ftrace Linux Kernel Tracing的slides值得一读。
3. 《使用 ftrace 调试 Linux 内核,第 2 部分》
地址:https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace2/index.html
主要是ftrace的使用方法
4. 《ftrace 简介》
地址:https://www.cnblogs.com/danxi/p/6417828.html