type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
跟踪点是内核代码的静态标记,可用于将代码附加在运行的内核中。跟踪点跟 kprobes 的主要区别在于跟踪点由内核开发人员在内核中编写和修改。这就是我们将跟踪点称作静态的原因。由于跟踪点是静态存在的,所以跟踪点的 ABI更稳定。内核保证旧版本上跟踪点将在新版本上存在。但是,考虑到跟踪点添加是由内核开发人员添加的,所以跟踪点可能并不会涵盖到内核的所有子系统。
通过查看
/sys/kernel/debug/tracing/events
目录下的内容可以查看系统中所有可用的跟踪点。例如查看 BPF 可用的所有的跟踪点:![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb51fd98f-d515-4228-a057-8a2590afd054%2FUntitled.png?table=block&id=84bad2f4-5ea1-4aac-96ff-167e8422f4e6&t=84bad2f4-5ea1-4aac-96ff-167e8422f4e6&width=765&cache=v2)
编写使用跟踪点的 BPF 程序与编写 kprobes 跟踪程序类似。下面的示例是使用 BPF 程序跟踪系统中加载的其他 BPF 程序:
example.py
程序的主要区别是:不是将程序附加到
kprobe
上,而是将其附加到跟踪点上。BCC 遵循追踪点命名约定,首先是指定要跟踪的子系统,这里是 syscalls:
,然后是子系统中的跟踪点 sys_enter_bpf
。这意味着每次内核执行 sys_enter_bpf
函数时,该程序将会收到该事件,并打印执行 sys_enter_bpf
指令的应用程序名称。内核探针和跟踪点提供了对内核的完全访问。由于跟踪点更加安全,我们推荐尽可能使用跟踪点,当然这不是强制的。在某些场景下,我们也需要利用内核探针的动态性质。
运行结果展示
结果分析
分析一下 update 程序的源码,可以看到在代码里面首先是加载 bpf 对象(第一次进入 bpf ),然后是更新对应键的值(第二次进入 bpf)与上面的运行结果一致。
- Author:tangcuyu
- URL:https://expoli.tech/articles/2023/01/06/bpf-example-program-tracepoint
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts