Linux内核调试和Perf Tracing
注意:
/sys/kernel/debug/tracing/tracing_on
不仅是用来控制 ftrace这个工具的启用与否,还会控制kprobe、uprobe等内核功能,因此ftrace的使用不应频繁控制tracing_on的开关(echo 1或者echo 0进去),而应当通过echo "nop" > current_tracer
的方式关闭ftrace
1. 内核调试
1.1 systemtap
1.1.1 相关资料:
1.2 ftrace
1.2.1 相关资料:
在
/sys/kernel/debug/tracing
下有比较多的文件用来配置ftrace,具体那些文件有哪些功能,看下面这个关于ftrace的内核文档就行。
1.2.2 实际操作例子:
注意,每次设置tracer或者过滤器前,最好能够将tracing_on设为0,否则在tracing过程中修改配置,可能导致系统卡顿一段时间。
首先进入到debugfs中方便操作:
1 |
|
- 查看并设置当前的tracer:
1 |
|
关于所有tracer的介绍,可以看文档:https://www.kernel.org/doc/html/latest/trace/ftrace.html#the-tracers。比较常用的tracer有:function
、function_graph
和nop
。 (nop
表示不进行任何操作。)
function
主要用来向上查看最终调用目标函数的调用链路;function_graph
主要用来查看一个函数调用了哪些函数。
1 |
|
- 设置过滤器:
当使用function
和function_graph
时,需要设置trace的目标。
1 |
|
注意
set_ftrace_filter
作用比较微妙,当tracer是function时,这个文件用来包含所有要追踪的函数;当tracer是function_graph时,这个文件用来过滤所有子过程。如果要修改set_ftrace_filter,请务必将current_tracer设置为nop,否则系统极可能会stuck住。。。
- 查看trace结果:
1 |
|
可能会得到如下的输出(如果设置了set_ftrace_filter
则可能显示的函数会更少一些):
1 |
|