bcc代码——Hello,world
1、简单监控clone()系统调用,将相关的信息打印出来
#!/usr/bin/python
from bcc import BPF
BPF(text="""
int kprobe__sys_clone(void *ctx){
bpf_trace_printk("hello,world!\\n");
return 0;
}
""").trace_print()
test="…"包含的是C语言编写的BPF程序
kprobe__sys_clone()对应内核kprobes的动态跟踪,也就是sys_clone()接口;
void *ctx这里没有用到参数,直接设置为void *类型
bpf_trace_printk()是一个通用的打印函数,会输出到trace_pipe中(/sys/kernel/debug/tracing/trace_pipe文件)然后trace_print()会读取上面的输出
2、格式化输出监控信息
#!/usr/bin/python
from bcc import BPF
prog="""
int hello(void *ctx){
bpf_trace_printk("hello,world!\\n");
return 0;
}
"""
#load BPF program
b=BPF(text=prog)
b.attach_kprobe(event=b.get_syscall_fnname("clone"),fn_name="hello")
#header and format output
print("%-18s %-16s %-6s %s" %("TIME(s)","COMM","PID","MESSAG"))
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))
采用hello()作为通用函数,而非使用kprobe__的前缀,接着,调用attach_kprobe()将hello()函数添加到系统调用clone()处
从全局共享文件/sys/kernel/debug/tracing/trace_pi/pe中读取一行并返回域。