Я хотел бы отслеживать функции конкретного PID и собирать некоторую статистику (общее количество вызовов, общее время и т. д.), и мне не совсем понятно, как создать BPF_HASH с парами funcname+my_struct.
Есть ли способ получить имена вызываемых функций в программе BPF?
Я полагаю, что мне следует прочитать регистр IP, используя «PT_REGS_IP (ctx)», но я не совсем понимаю, как преобразовать значение в удобочитаемую строку.
На данный момент программа BPF выглядит следующим образом:
#include <uapi/linux/ptrace.h>
#include <linux/sched.h>
struct data_t {
u32 pid;
u64 delta;
u64 start;
} __attribute__((packed));
BPF_HASH(faddr, u64, struct data_t);
BPF_PERF_OUTPUT(events);
int do_entry(struct pt_regs *ctx) {
struct data_t *data;
data->start = bpf_ktime_get_ns();
u64 ip = PT_REGS_IP(ctx);
faddr.update(&ip, data);
return 0;
}
int do_return(struct pt_regs *ctx) {
struct data_t *data;
u64 ip = PT_REGS_IP(ctx);
data = faddr.lookup(&ip);
if (data->start == 0)
return 0; // missed start
data->delta = bpf_ktime_get_ns() - data->start;
data->pid = bpf_get_current_pid_tgid();
events.perf_submit(ctx, &data, sizeof(data));
faddr.delete(&ip);
return 0;
}
Но при запуске я получил:
error: <unknown>:0:0: in function do_entry i32 (%struct.pt_regs*): A call to built-in function 'abort' is not supported.