通过bcc 使用ebpf

通过前一篇博文知道要使用ebpf debug kernel还是相当麻烦的,github 上有个项目
https://github.com/iovisor/bcc 可以简化ebpf的操作,应为kernel space已经支持ebpf,所以这个项目主要集中在user space部分的编写,user space 可以通过各种语言编写,这里以python为例.
下面的代码的是在调用sys_clone的时候调用hello 函数来输出Hello, World


#!/usr/bin/env python
#
# This is a Hello World example that formats output as fields.

from bcc import BPF

# define BPF program
定义处理函数
prog = """
int hello(void *ctx) {
    bpf_trace_printk("Hello, World!\\n");
    return 0;
}
"""

# load BPF program
加载BPF 加载hello
b = BPF(text=prog)
指定调用sys_clone时候对应的回调函数是hello
b.attach_kprobe(event="sys_clone", fn_name="hello")

# header
print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "MESSAGE"))

# format output
监听并输出log
while 1:
    try:
        (task, pid, cpu, flags, ts, msg) = b.trace_fields()
    except ValueError:
        continue
    print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg))

你可能感兴趣的:(Linux,源码分析)