tracepoint机制介绍

说明

/sys/kernel/debug/tracing/events/syscalls中,看有看到所有有关系统调用的tracepoint

进入到/sys/kernel/debug/tracing/events/syscalls/sys_enter_execve,看有看到具体的选项

1
2
3
4
5
6
7
8
9
10
total 0
drwxr-x--- 2 root root 0 6月 22 18:47 .
drwxr-x--- 688 root root 0 6月 22 18:47 ..
-rw-r----- 1 root root 0 6月 22 18:47 enable
-rw-r----- 1 root root 0 6月 22 18:47 filter
-r--r----- 1 root root 0 6月 22 18:47 format
-r--r----- 1 root root 0 6月 22 18:47 hist
-r--r----- 1 root root 0 6月 22 18:47 id
--w------- 1 root root 0 6月 22 18:47 inject
-rw-r----- 1 root root 0 6月 22 18:47 trigger

下面是每个文件的含义:

  • 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文件写入,就可以设置某些过滤条件. 常见的过滤条件有:

在事件跟踪中,可以使用不同的过滤条件来筛选和捕获特定的事件。以下是一些常见的过滤条件示例:

  1. 进程名称(comm):根据进程的名称进行过滤。

    1
    comm=="target_process"
  2. 进程 ID(pid):根据进程的 ID 进行过滤。

    1
    pid==1234
  3. 用户 ID(uid):根据用户的 ID 进行过滤。

    1
    uid==1000
  4. 组 ID(gid):根据组的 ID 进行过滤。

    1
    gid==1000
  5. 文件路径(filename):根据文件的路径进行过滤。

    1
    filename=="/path/to/file"
  6. 系统调用号(syscall):根据系统调用的编号进行过滤。

    1
    syscall==__NR_open
  7. 参数匹配:根据系统调用的参数进行过滤。

    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: 环境变量指针字段,表示传递给可执行文件的环境变量。

最后一行是打印格式信息,它定义了如何将字段的值格式化为可读的字符串。在这种情况下,它打印了 filenameargvenvp 字段的十六进制地址。

实际演示

通过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