trace-cmd 是一个易于使用,且特性众多、可用来追踪内核函数的命令。
在 之前的文章 里,我介绍了如何利用 ftrace
来追踪内核函数。通过写入和读出文件来使用 ftrace
会变得很枯燥,所以我对它做了一个封装来运行带有选项的命令,以启用和禁用追踪、设置过滤器、查看输出、清除输出等等。
trace-cmd 命令是一个可以帮助你做到这一点的工具。在这篇文章中,我使用 trace-cmd
来执行我在 ftrace
文章中所做的相同任务。由于会经常参考那篇文章,建议在阅读这篇文章之前先阅读它。
安装 trace-cmd
本文中所有的命令都运行在 root 用户下。
因为 ftrace
机制被内置于内核中,因此你可以使用下面的命令进行验证它是否启用:
# mount | grep tracefs
none on /sys/kernel/tracing type tracefs (rw,relatime,seclabel)
不过,你需要手动尝试安装 trace-cmd
命令:
# dnf install trace-cmd -y
列出可用的追踪器
当使用 ftrace
时,你必须查看文件的内容以了解有哪些追踪器可用。但使用 trace-cmd
,你可以通过以下方式获得这些信息:
# trace-cmd list -t
hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop
启用函数追踪器
在我 之前的文章 中,我使用了两个追踪器,在这里我也会这么做。用 function
启用你的第一个追踪器:
$ trace-cmd start -p function
plugin 'function'
查看追踪输出
一旦追踪器被启用,你可以通过使用 show
参数来查看输出。这只显示了前 20 行以保持例子的简短(见我之前的文章对输出的解释):
# trace-cmd show | head -20
## tracer: function
#
# entries-in-buffer/entries-written: 410142/3380032 #P:8
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
gdbus-2606 [004] ..s. 10520.538759: __msecs_to_jiffies