zl程序教程

您现在的位置是:首页 >  其它

当前栏目

bcc之hello world

Hello World
2023-09-27 14:29:04 时间

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()

image

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中读取一行并返回域。

image