说明
在/sys/kernel/debug/tracing/events/syscalls
中,看有看到所有有关系统调用的tracepoint
进入到/sys/kernel/debug/tracing/events/syscalls/sys_enter_execve
,看有看到具体的选项
1 | total 0 |
下面是每个文件的含义:
enable
: 该文件用于启用或禁用 tracepoint 事件的跟踪。通过向该文件写入非零值,可以启用事件的跟踪;写入零值将禁用事件的跟踪。filter
: 该文件用于设置 tracepoint 事件的过滤器。通过向该文件写入特定的过滤规则,您可以选择性地过滤掉某些事件,以便只记录感兴趣的事件。format
: 该文件包含了 tracepoint 事件的格式信息。通过读取该文件,您可以查看事件的字段和其对应的数据类型。hist
: 该文件包含了 tracepoint 事件的直方图(histogram)信息。通过读取该文件,您可以获取关于事件发生次数的统计信息,例如事件发生的频率、分布等。id
: 该文件包含了 tracepoint 事件的唯一标识符。通过读取该文件,您可以获取事件的标识符,用于进一步操作或引用该事件。inject
: 该文件用于向 tracepoint 事件注入数据。通过向该文件写入特定的数据,可以模拟触发事件并将自定义数据注入到事件中。trigger
: 该文件用于触发 tracepoint 事件。通过向该文件写入非零值,可以手动触发事件的记录。
这些文件提供了与 tracepoint 事件相关的控制和信息访问接口,您可以使用它们来配置和操作 tracepoint 事件的跟踪和记录。请注意,对这些文件的访问需要相应的权限(通常是 root 用户)。
enable
通过echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_execve/enable
,就可以开启sys_enter_execve
.
filter
通过向filter
文件写入,就可以设置某些过滤条件. 常见的过滤条件有:
在事件跟踪中,可以使用不同的过滤条件来筛选和捕获特定的事件。以下是一些常见的过滤条件示例:
进程名称(comm):根据进程的名称进行过滤。
1
comm=="target_process"
进程 ID(pid):根据进程的 ID 进行过滤。
1
pid==1234
用户 ID(uid):根据用户的 ID 进行过滤。
1
uid==1000
组 ID(gid):根据组的 ID 进行过滤。
1
gid==1000
文件路径(filename):根据文件的路径进行过滤。
1
filename=="/path/to/file"
系统调用号(syscall):根据系统调用的编号进行过滤。
1
syscall==__NR_open
参数匹配:根据系统调用的参数进行过滤。
1
arg1==42 && arg2>100
trace_pipe
通过/sys/kernel/debug/tracing/trace_pipe
就可以查看到具体的输出数据.
format
查看format
文件内容:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# cat format
name: sys_enter_execve
ID: 716
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid; offset:4; size:4; signed:1;
field:int __syscall_nr; offset:8; size:4; signed:1;
field:const char * filename; offset:16; size:8; signed:0;
field:const char *const * argv; offset:24; size:8; signed:0;
field:const char *const * envp; offset:32; size:8; signed:0;
print fmt: "filename: 0x%08lx, argv: 0x%08lx, envp: 0x%08lx", ((unsigned long)(REC->filename)), ((unsigned long)(REC->argv)), ((unsigned long)(REC->envp))
format
文件中记录了该事件的字段和格式信息。下面是每个字段及其含义:
common_type
: 通用类型字段,表示事件记录的类型。common_flags
: 通用标志字段,表示事件记录的标志。common_preempt_count
: 通用抢占计数字段,表示事件记录的抢占计数。common_pid
: 通用进程 ID 字段,表示事件记录所属的进程 ID。
接下来是特定于 sys_enter_execve
tracepoint 的字段:
__syscall_nr
: 系统调用号字段,表示正在执行的系统调用的编号。filename
: 文件名字段,表示被执行的可执行文件的路径。argv
: 参数向量字段,表示传递给可执行文件的命令行参数。envp
: 环境变量指针字段,表示传递给可执行文件的环境变量。
最后一行是打印格式信息,它定义了如何将字段的值格式化为可读的字符串。在这种情况下,它打印了 filename
、argv
和 envp
字段的十六进制地址。
实际演示
通过echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_execve/enable
开启之后,就可以通过/sys/kernel/debug/tracing/trace_pipe
查看到具体数据.
其他
由于tracepoint
在操作系统中是一个很稳定的机制,所以很多的系统工具都是基于tracepoint
来实现的,例如perf
,bpftrace
等.由于这些工具不是本文的重点,所以不再赘述.
参考
https://blog.csdn.net/rikeyone/article/details/116057261
https://www.kernel.org/doc/html/v4.19/trace/events.html