bccでuprobes

前回(LinuxのBPFとbccでデバッグする - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ)はbccを使ってkprobeでカーネル内の関数にprobeを設定したので今回はユーザーランドのほうでuprobesを使うメモ。

fork()が呼ばれたときにプロセス名、pid等を表示する。

#!/usr/bin/env python

from bcc import BPF

bpf_source = """
#include <uapi/linux/ptrace.h>

void fork_enter(struct pt_regs *ctx)
{
    bpf_trace_printk("fork()\\n");
}
"""

b = BPF(text=bpf_source)

b.attach_uprobe(name="c", sym="fork", fn_name="fork_enter")

while True:
    print(b.trace_fields())

tmuxで新しくpaneを開いたときのログ。

masami@saga:~$ sudo ./fork_uprobes.py
('tmux', 1440, 6, '...1', 9958.085434, 'fork()')
('tmux', 1440, 6, '...1', 9958.086429, 'fork()')
('bash', 13641, 6, '...1', 9958.091415, 'fork()')
('bash', 13643, 10, '...1', 9958.091923, 'fork()')
('bash', 13641, 6, '...1', 9958.122954, 'fork()')
('bash', 13645, 10, '...1', 9958.123817, 'fork()')
('bash', 13646, 0, '...1', 9956.180263, 'fork()')

uprobeの設定はattach_uprobe()でしていて、他にattach_uretprobe()があってこれはreturnするときに呼ばれるもの。あとはattach_kprobe()、attach_kretprobe()なんかもあって、これらは名前の通りでuprobesではなくてkprobesになる。 昨日は関数名にprefixとしてkprobe__を付けたけど、attach_xxx()な関数でも同じことができる。