Я пытаюсь создать инструмент, в котором я присоединяю программу BPF к точкам входа для всех системных вызовов. Из CLI я смог присоединиться ко всем записям syscall через
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* /comm != "bpftrace"/ {printf("Process Name: %s\nSyscall Requested: %s\n", comm, probe);}'
, и это здорово, но я хочу делать более сложные вещи. Я обнаружил, что могу присоединять программы BPF к событиям kprobe, используя внешний интерфейс python как таковой -
#!/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
, однако нашел __tracepoint_sys_enter в /proc/kallsyms
. Однако, когда я попытался заменить __x64_sys_clone на __tracepoint_sys_enter, я получил ошибку неверного аргумента. Мне интересно, могу ли я присоединиться ко всем входам системного вызова (и в конечном итоге выйти) с помощью kprobes? Или мне нужно использовать другой механизм отслеживания. Спасибо!