简介
在本次实验中,你将探索如何检查 Linux 内核跟踪点(tracepoint)是否处于激活状态。跟踪点对于观察内核事件至关重要,在调试和性能分析方面具有不可估量的价值。首先,你将使用 /sys/kernel/debug/tracing
文件系统列出系统中可用的跟踪点。
在初步探索之后,你将学习如何使用 trace-cmd
工具检查特定跟踪点的状态,最后通过查看 /proc/kallsyms
文件来验证跟踪点。
在本次实验中,你将探索如何检查 Linux 内核跟踪点(tracepoint)是否处于激活状态。跟踪点对于观察内核事件至关重要,在调试和性能分析方面具有不可估量的价值。首先,你将使用 /sys/kernel/debug/tracing
文件系统列出系统中可用的跟踪点。
在初步探索之后,你将学习如何使用 trace-cmd
工具检查特定跟踪点的状态,最后通过查看 /proc/kallsyms
文件来验证跟踪点。
ls /sys/kernel/debug/tracing
列出跟踪点在这一步中,你将开始探索 Linux 跟踪点(tracepoint)。跟踪点是置于内核源代码中的钩子,可让你观察内核内部发生的特定事件。它们在调试和性能分析方面非常有价值。
Linux 内核提供了一个跟踪框架,通常可以通过 /sys/kernel/debug/tracing
目录进行访问。该目录包含各种用于控制跟踪并提供跟踪信息的文件。
要查看系统中可用的跟踪点,你可以列出跟踪文件系统中 events
目录的内容。
如果终端尚未打开,请打开它。记住,你可以在桌面左侧找到 Xfce 终端 图标。
现在,输入以下命令并按回车键:
ls /sys/kernel/debug/tracing/events
此命令使用 ls
列出 /sys/kernel/debug/tracing/events
目录的内容。events
目录是内核公开可用跟踪点的地方,这些跟踪点按子系统进行组织。
你会看到一个目录列表,每个目录代表一个内核子系统(如 syscalls
、sched
、ext4
等)。这些目录中包含实际的跟踪点名称。
例如,你可能会看到类似以下的输出(确切的输出会因内核版本和配置而异):
block/ ext4/ kmem/ net/ pci/ random/ sock/ task/ workqueue/
bpf/ fib/ kvm/ nfs/ power/ raw_syscalls/ signal/ timer/ xfs/
compaction/ ftrace/ libata/ nipi/ printk/ regmap/ skb/ udp/ xen/
cpu-freq/ gpio/ mdio/ oom/ qdisc/ rpm/ snd/ vmscan/
cgroup/ header_event header_page irq/ migrate/ pagemap/ ras/ scsi/ spi/ writeback/
dma_fence/ i2c/ kcsan/ module/ perf_events/ rcu/ sfc/ syscalls/ xhci-hcd/
enable iommu/ kprobe/ mpx/ powerpc/ regulator/ signal/ tcp/ xilinx-vsec/
exceptions/ iov/ kscan/ napi/ probe/ rpm/ skb/ timer/ xfs/
此输出显示了你可以跟踪的不同事件类别。在接下来的步骤中,你将学习如何检查这些跟踪点的状态。
点击 继续 以继续操作。
trace-cmd
检查跟踪点状态在上一步中,你通过查看 /sys/kernel/debug/tracing/events
目录列出了可用的跟踪点(tracepoint)。现在,你将使用 trace-cmd
工具来获取有关跟踪点的更详细信息,特别是它们的状态(启用或禁用)。
trace-cmd
命令是与 Linux 跟踪框架进行交互的强大工具。如果尚未安装 trace-cmd
,你可以使用 apt
进行安装。
首先,更新软件包列表:
sudo apt update
然后,安装 trace-cmd
:
sudo apt install trace-cmd
你可能会看到表明 trace-cmd
已安装的输出,这是正常的。
现在,要列出所有可用的跟踪点及其状态,请使用 trace-cmd list -e
命令。-e
选项告诉 trace-cmd
列出事件(跟踪点)。
输入以下命令并按回车键:
trace-cmd list -e
此命令将输出一长串跟踪点,显示它们所属的子系统和名称,后面跟着它们的当前状态(用方括号表示,如 [enabled]
或 [disabled]
)。
你会看到类似以下的输出(同样,确切的列表会有所不同):
block:block_bio_backmerge [disabled]
block:block_bio_bounce [disabled]
block:block_bio_complete [disabled]
block:block_bio_frontmerge [disabled]
block:block_bio_queue [disabled]
block:block_bio_remap [disabled]
block:block_dirty_buffer [disabled]
block:block_getrq [disabled]
block:block_plug [disabled]
block:block_rq_complete [disabled]
block:block_rq_insert [disabled]
block:block_rq_issue [disabled]
block:block_rq_remap [disabled]
block:block_rq_requeue [disabled]
block:block_sync_buffer [disabled]
block:block_touch_buffer [disabled]
block:block_unplug [disabled]
bpf:bpf_trace_printk [disabled]
bpf:bpf_trace_vprintk [disabled]
... (many more tracepoints)
如你所见,大多数跟踪点默认是禁用的,以避免性能开销。通常,你会在需要跟踪特定内核事件时启用特定的跟踪点。
使用 trace-cmd list -e
是一种方便的方法,可以查看完整的跟踪点列表及其当前状态,而无需手动浏览 /sys/kernel/debug/tracing
文件系统。
点击 继续 进入下一步。
/proc/kallsyms
中验证跟踪点在前面的步骤中,你学习了如何使用跟踪文件系统和 trace-cmd
工具列出跟踪点(tracepoint)。现在,你将探索另一种查看跟踪点信息的方法:通过 /proc/kallsyms
文件。
/proc/kallsyms
文件包含所有导出的内核符号(包括函数和变量)的地址和名称。跟踪点在这个文件中也以符号的形式表示。
你可以使用 cat
和 grep
等命令在 /proc/kallsyms
中搜索跟踪点符号。跟踪点符号通常遵循一定的命名约定,常常包含 tracepoint
或 _tracepoint
。
让我们尝试在 /proc/kallsyms
中查找与跟踪点相关的符号。你将使用 cat
读取文件,并将输出通过管道传递给 grep
,以搜索包含 "tracepoint" 这个词的行。
输入以下命令并按回车键:
cat /proc/kallsyms | grep tracepoint
此命令将显示 /proc/kallsyms
中包含字符串 "tracepoint" 的行。你会看到类似以下的输出:
...
ffffffffXXXXXXXX R __tracepoint_module_load
ffffffffXXXXXXXX R __tracepoint_module_free
ffffffffXXXXXXXX R __tracepoint_module_get
ffffffffXXXXXXXX R __tracepoint_module_put
ffffffffXXXXXXXX R __tracepoint_module_request_module
ffffffffXXXXXXXX R __tracepoint_module_module_init
ffffffffXXXXXXXX R __tracepoint_module_module_exit
ffffffffXXXXXXXX R __tracepoint_module_module_request
ffffffffXXXXXXXX R __tracepoint_module_module_autoload
ffffffffXXXXXXXX R __tracepoint_module_module_kset_reg
ffffffffXXXXXXXX R __tracepoint_module_module_kset_unreg
...
XXXXXXXX
代表十六进制地址,在你的系统上这些地址会有所不同。重要的部分是符号名称,通常以 __tracepoint_
开头,后面跟着子系统和事件名称。
这证实了跟踪点确实在内核的符号表中以符号的形式存在,并且可以通过 /proc/kallsyms
访问。虽然 /sys/kernel/debug/tracing
和 trace-cmd
为管理和查看跟踪点提供了更用户友好的界面,但理解它们作为内核符号存在是高级内核跟踪概念的基础。
你现在已经学习了三种在 Linux 系统上识别和检查跟踪点的不同方法。
点击 继续 完成此实验。
在本实验中,你首先探索了 Linux 跟踪点(tracepoint),它对于内核调试和性能分析至关重要。你了解到 /sys/kernel/debug/tracing
目录提供了对内核跟踪框架的访问。具体来说,你使用了 ls /sys/kernel/debug/tracing/events
命令来列出可用的跟踪点,这些跟踪点在 events
目录中按内核子系统进行组织。这第一步展示了如何识别系统上可以跟踪的各种内核事件。