• bcc之hello world


    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

  • 相关阅读:
    第二周作业修改+
    第三周作业
    第二周作业修改
    第三次作业
    第二次作业
    获奖感想
    最后的作业
    14周作业
    第七周作业
    第六周作业
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/16758068.html
Copyright © 2020-2023  润新知