说明
通过查看 /sys/kernel/debug/tracing/events/raw_syscalls 目录,你可以获取系统中所有可用的 raw_tracepoint 的列表。
请注意,访问 /sys/kernel/debug/tracing 目录通常需要 root 权限或者在调试组中的用户权限。因此,你可能需要以超级用户(root)或使用 sudo 来执行上述命令。
希望这能帮助你在 Linux 系统上查看系统中的 raw_tracepoint,而无需依赖第三方工具。在当前目录下查看,可以看到如下的文件:1
2
3
4
5
6
7
8# ls -al /sys/kernel/debug/tracing/events/raw_syscalls/
total 0
drwxr-x--- 4 root root 0 7月 27 10:17 .
drwxr-x--- 123 root root 0 7月 27 10:17 ..
-rw-r----- 1 root root 0 7月 27 10:17 enable
-rw-r----- 1 root root 0 7月 27 10:17 filter
drwxr-x--- 2 root root 0 7月 27 10:17 sys_enter
drwxr-x--- 2 root root 0 7月 27 10:17 sys_exit
可以看到,在当前的目录下,存在两个raw_tracepoint类型的系统调用,分别是sys_enter和sys_exit。一般情况下,在Linux默认情况下,都会存在sys_enter和sys_exit,这两个raw_tracepoint类型的系统调用。
Raw Tracepoint 是一种更底层的跟踪机制,它允许开发人员在内核中的任意位置定义自定义的跟踪事件。Raw Tracepoint 提供了更大的灵活性,因为开发人员可以在内核的任意代码路径中插入跟踪点,以捕获感兴趣的事件。与 Tracepoint 不同,Raw Tracepoint 的定义和触发点是在内核编译时生成的,而不是在源代码中静态定义的。开发人员可以使用 tracepoint.h 头文件中的宏来定义和触发 Raw Tracepoint。
sys_enter
/sys/kernel/debug/tracing/events/raw_syscalls/sys_enter 查看目录下具体的内容:
1 | total 0 |
每个文件的含义如下:
enable: 用于启用或禁用sys_enter事件的跟踪。通过向该文件写入1或0来启用或禁用跟踪。filter: 用于设置sys_enter事件的过滤器。你可以将过滤条件写入该文件,以便只跟踪满足条件的sys_enter事件。format: 包含了sys_enter事件的格式定义。你可以读取该文件来获取sys_enter事件的参数和输出格式。hist: 包含了sys_enter事件的历史记录,包括每个事件的计数和时间戳等信息。id: 包含了sys_enter事件的唯一标识符。inject: 用于触发sys_enter事件的注入。通过向该文件写入相应的值,可以手动触发sys_enter事件。trigger: 用于触发sys_enter事件的触发器。通过向该文件写入相应的值,可以触发sys_enter事件。
针对其中的几个主要文件进行分析:
format
1 | name: sys_enter |
通过print fmt,可以看到具体的输出格式,NR表示系统调用号,后面的%lx表示具体的参数,REC->args[0]表示第一个参数,REC->args[1]表示第二个参数,以此类推。
在内核文件 syscalls.h 中也可以找到对应的定义。
1 |
|
内核态
为了方便演示raw_tracepoint的功能,

参考
https://mozillazg.com/2022/05/ebpf-libbpf-raw-tracepoint-common-questions-en.html