Как прочитать трассировку стека на стороне ядра в ebpf?

Я хотел бы отфильтровать свой ebpf с адресом в стеке, например, если трассировка стека содержит адрес _do_fork, а затем записать на карту.

Я видел это https://www.kernel.org/doc/html/latest/bpf/bpf_design_QA.html#q-can-bpf-programs-access-stack-pointer говорит, что невозможно получить адреса . Но я также видел это https://www.spinics.net/lists/netdev/msg497159.html «Программа bpf может видеть все трассировки стека, а затем может выполнять обработку в ядре или отправлять трассировки стека в пространство пользователя». Так что я в замешательстве. Последний вопрос: как мы можем получить адреса трассировки стека в ядре с помощью bpf_get_stack, если это возможно?

заранее спасибо


person LeChatP    schedule 30.07.2019    source источник


Ответы (1)


Доступ к трассировкам стека возможен.

Первая упомянутая вами ссылка (bpf_design_QA) не относится к трассируемой программе, она имеет дело с указателем стека, используемым самой программой BPF при выполнении операции трассировки. Но, как указано в журнале коммитов для bpf_get_stack(), вы можете получить доступ к стеку.

Существует некоторая документация для помощников BPF, например bpf_get_stack(), доступна онлайн. Возможно, вы захотите взглянуть на код примеры, использующие его.

У меня нет большого опыта в трассировке стека, но кажется, что очень немногие инструменты, делающие это, на самом деле используют помощника bpf_get_stack(). Вместо этого инструменты из bcc, такие как profile, или из образцов ядра, таких как offwaketime (BPF side, user space side) обычно используют карты трассировки стека (BPF_MAP_TYPE_STACK_TRACE), так что вы можете взглянуть и на это (bcc даже предлагает специальный API для них).

person Qeole    schedule 30.07.2019