前回(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()な関数でも同じことができる。
プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化
- 作者: WINGSプロジェクト阿佐志保
- 出版社/メーカー: 翔泳社
- 発売日: 2015/11/19
- メディア: Kindle版
- この商品を含むブログ (1件) を見る