4

tracepoint机制介绍

 11 months ago
source link: https://blog.spoock.com/2023/08/15/eBPF-tracepoint/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

tracepoint机制介绍

2023-08-15

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

202307231142830.png

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

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):根据进程的名称进行过滤。

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

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

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

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

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

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

    arg1==42 && arg2>100

trace_pipe

通过/sys/kernel/debug/tracing/trace_pipe就可以查看到具体的输出数据.

format

查看format 文件内容:

# 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 查看到具体数据.

202308132012290.png

由于tracepoint在操作系统中是一个很稳定的机制,所以很多的系统工具都是基于tracepoint来实现的,例如perf,bpftrace等.由于这些工具不是本文的重点,所以不再赘述.

https://blog.csdn.net/rikeyone/article/details/116057261
https://www.kernel.org/doc/html/v4.19/trace/events.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK