c - 读取 eBPF 跟踪点参数
问题描述
假设我有一个与 chown 函数挂钩的跟踪点 eBPF 探针。
SEC("tracepoint/syscalls/sys_enter_chown")
int bpf_prog(void *ctx) {
// someone changed ownership of a file
char msg[] = "Ownership change of file!";
bpf_trace_printk(msg, sizeof(msg));
}
如何访问呼叫的上下文?例如,如果我想打印出更改所有权或新所有者的文件怎么办?
解决方案
TL;博士。在 的情况下sys_enter_chown
,您的ctx
论点将具有以下结构:
struct syscalls_enter_chown_args {
unsigned long long unused;
long syscall_nr;
long filename_ptr;
long user;
long group;
};
正如这个 SO answer所指出的,跟踪点挂钩记录在内核中。sys_enter_chown
您可以在以下位置找到的参数的完整描述/sys/kernel/debug/tracing/events/syscalls/sys_enter_chown/format
:
# cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_chown/format
name: sys_enter_chown
ID: 625
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:uid_t user; offset:24; size:8; signed:0;
field:gid_t group; offset:32; size:8; signed:0;
print fmt: "filename: 0x%08lx, user: 0x%08lx, group: 0x%08lx", ((unsigned long)(REC->filename)), ((unsigned long)(REC->user)), ((unsigned long)(REC->group))
您还可以查看内核示例中的示例 BPF 跟踪点程序。它实现了您正在寻找的东西,但对于sys_enter_open
.
推荐阅读
- c - 如何将 CMSIS DSP 库中的转换函数添加到 Makefile?
- haskell - 无论我尝试多少种不同的方法,都无法编译一些简单的 Haskell 代码
- java - 创建 JAR 文件后,命令行返回“错误:无法找到或加载主类 ExampleProgram”?
- mysql - 错误:错误 1822:添加外键约束失败
- c - 在 C 中将程序集跳转命令转换为其十六进制值
- python - 修改全局变量的函数范围中两个变量赋值之间的区别
- java - 带有 PendingIntent 的 Android 通知的额外 null
- c# - 实体框架核心更新数据库 - 无需迁移的代码优先方法
- php - PHP 正则表达式 来自任何语言的任何类型的字母
- python - 使用 kivy 在运行时生成标签