У вас есть ошибка в вашей функции do_entry
. Вы пытаетесь разыменовать нулевой указатель:
struct data_t *data;
data->start = bpf_ktime_get_ns();
Следующее должно работать лучше:
int do_entry(struct pt_regs *ctx) {
struct data_t data = {}; // initializes data with zeros.
data.start = bpf_ktime_get_ns();
u64 ip = PT_REGS_IP(ctx);
faddr.update(&ip, &data);
return 0;
}
Я не понимаю, почему в сообщении об ошибке упоминается abort
. Я спрошу вокруг.
Как преобразовать адреса памяти в имена функций будет зависеть от используемой вами библиотеки пользовательского пространства. Если вы используете bcc, вы можете использовать метод ksym
. Я не знаю, есть ли эквивалент в gobpf.
У вас есть по крайней мере еще одна ошибка, в do_return
:
data = faddr.lookup(&ip);
if (data->start == 0)
return 0; // missed start
Вам нужно будет проверить, не является ли значение data
нулевым, перед разыменованием В противном случае верификатор отклонит вашу программу.
data = faddr.lookup(&ip);
if (!data || data->start == 0)
return 0; // missed start