我正在尝试构建一个工具,其中我将 BPF 程序附加到所有系统调用的入口点。在 CLI 中,我能够通过附加到所有系统调用条目
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* /comm != "bpftrace"/ {printf("Process Name: %s\nSyscall Requested: %s\n", comm, probe);}'
这很棒,但我想做更复杂的事情。我发现我可以使用 python 的前端将 BPF 程序附加到 kprobe 事件中——
#!/usr/bin/python
from bcc import BPF
prog = """
int hello(void *ctx){
bpf_trace_printk("Hello, world!\\n");
return 0;
}
"""
b = BPF(text=prog)
b.attach_kprobe(event="__x64_sys_clone", fn_name="hello)
print("TIME(s)", "COMM", "PID", "MESSAGE")
while 1:
try:
(task, pid, cpu, flags, ts, msg) = b.trace_fields()
except ValueError:
continue
except KeyboardInterrupt:
exit()
printb(b"%-18.9f %-16s %-6d %s" %(ts, task, pid, msg))
但是,在 attach_kprobe 行中,我想附加到所有系统调用条目而不是 sys_clone。但是,我没有找到任何 sys_enter 跟踪点,/sys/kernel/debug/tracing/available_filter_functions
但我在/proc/kallsyms
. 但是,当我尝试用 __tracepoint_sys_enter 替换 __x64_sys_clone 时,我得到一个无效的参数错误。我想知道,我可以使用 kprobes 附加到所有系统调用条目(并最终退出)吗?还是我需要使用不同的跟踪机制。谢谢!