通过前一篇博文知道要使用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))
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))