eBPF监控工具bcc系列九bcc Python

接下来看下python方面的知识。

1.   初始化

1.1     BPF

语法:

BPF({text=BPF_program | src_file=filename} [, usdt_contexts=[USDT_object, ...]])

创建一个BPF对象,能通过交互来产生输出。

1.2     USDT

语法:USDT({pid=pid | path=path})

创建对象来使用USDT,可以指定进程ID,路径。

2.   事件

2.1     attach_kprobe

语法:BPF.attach_kprobe(event="event", fn_name="name")

使用函数入口的内核动态跟踪,关联C函数name和内核函数event()。

2.2     attach_kretprobe

语法:BPF.attach_kretprobe(event="event", fn_name="name")

关联C函数name和内核函数event,在内核函数返回的时候调用函数name.

2.3     attach_tracepoint

语法:BPF.attach_tracepoint(tp="tracepoint", fn_name="name")

关联C语言定义的BPF函数和内核的tracepoint。也可以使用TRACEPOINT_PROBE宏,使用该宏可以使用高级的自申明的args结构体包含了tracepoint参数。如果,使用attach_tracepoint,参数需要在BPF程序中声明。

2.4     attach_uprobe

语法:BPF.attach_uprobe(name="location", sym="symbol", fn_name="name")

将在location中的函数事件symbol,关联到C定义的函数。当symbol调用时候回调用name函数。

            例如:

b.attach_uprobe(name="c"sym="strlen"fn_name="count")

2.5     attach_uretprobe

语法:BPF.attach_uretprobe(name="location", sym="symbol", fn_name="name")

同attach_uprobe,不过是在函数返回时候调用name函数。

2.6     USDT.enable_probe

语法:USDT.enable_probe(probe=probe, fn_name=name)

将BPF的C函数附加到USDT探针上。

例如:

= USDT(pid=int(pid))

u.enable_probe(probe="http__server__request"fn_name="do_trace")

查看二进制文件是否有USDT探针,可以使用如下命令检测stap调试段:

#readelf –n binary 

3.   调试输出

3.1     trace_print

语法:BPF.trace_print(fmt="fields")

持续读取全局共享的/sys/kernel/debug/tracing/trace_pipe文件并输出。这个文件可以被BPF 和bpf_trace_printk()函数写入。

例如:

# print trace_pipe output as-is:

b.trace_print()

# print PID and message:

b.trace_print(fmt="{1} {5}")

3.2     trace_fields

语法:BPF.trace_fields(nonblocking=False)

从全局共享文件/sys/kernel/debug/tracing/trace_pipe文件中读取一行并返回域。参数表示在等待写入的时候是否blocking.

4.   输出

4.1     perf_buffer_poll

语法:BPF.perf_buffer_poll()

从perf ring buffers等待数据,有数据会调用open_perf_buffer指定的回调函数。

例如:

# loop with callback to print_event

b["events"].open_perf_buffer(print_event)

while 1:

    b.perf_buffer_poll()

5.   映射

5.1     get_table

返回表对象。此函数已经淘汰,因为BFP可以将表作为items来读取,例如BFP[name].

5.2     open_perf_buffer

语法:table.open_perf_buffers(callback, page_cnt=N, lost_cb=None)

            当perf ring buffer中数据可用的时候,调用callback函数。其中table是定义在BPF的。这个是从内核到用户层传递perf event数据的建议方式。

perf ring buffer的大小由page_cnt参数制定,建议是页的偶数倍,默认是8。如果callback处理的不够快,有些数据会丢失掉。当有丢失数据到时候会调用lost_cb。如果lost_cb定义为none,那么会打印一行信息到stderr。

5.3     items

返回表中keys的数组。可以通过BPF_HASH来获取,迭代。

5.4     values

返回表中values数组。

5.5     clear

清除表。

5.6     print_log2_hist

语法:table.print_log2_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None)

            使用ASCII以log2直方图打印表。表必须用log2方式存储,这个可以通过bpf_log2()。

            val_type可选的,表示列头。

            section_header:如果直方图有第二个键,多个表会被打印,section_header会被作为头描述。

            如果section_print_fn不是none,传递bucket值。

5.7     print_linear_hist

语法:table.print_linear_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None)

以ASCII方式打印表的线性直方图。

val_type参数可选的,列的头

section_header:如果直方图有第二个键,多个图会打印,section_header会被作为头描述符。

section_print_fn:如果该参数不会NONE,会被传递bucket值。

 

6.   帮助

6.1     ksym

语法:BPF.ksym(addr)

将一个内核内存地址转成一个内核函数名字。

6.2     ksymname

语法:BPF.ksymname(name)

将一个内核名字转换成一个地址,是ksym的逆向函数。

6.3     sym

语法:BPF.sym(addr, pid, show_module=False, show_offset=False)

为进程转换一个内存地址位函数名字。

参数show_module,show_offset参数控制是否显示symbol符号所在的模块,符号偏移。

6.4     num_open_kprobes

返回打开的k[ret]probes数量。在event_re场景中有用。

 

7.   关于BPF Errors

BPF中所有内存读取都要通过bpf_probe_read()函数将内存复制到BPF栈。如果直接读取内存,会出现Invalid mem access。

参考文件:

内核中Documentation/networking/filter.txt

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
eBPF python是一个框架,允许用户编写使用eBPF程序嵌入其中的Python程序。这个框架主要用于应用程序和系统分析/跟踪的场景,其中eBPF程序用于收集统计信息或生成事件,而用户空间中的对应部分则负责收集数据并以人类可读的形式进行显示。运行Python程序会生成eBPF字节码并将其加载到内核中。 在Python中使用eBPF的高级封装BCC来开发eBPF程序的步骤如下: 1. 首先,通过导入BCC库来使用它提供的功能。 2. 使用BPF类加载eBPF程序。 3. 使用attach_kprobe方法将BPF程序挂载到内核的探针上。 4. 使用trace_print方法读取内核调试文件的内容并打印到标准输出中。 在另一个例子中,也是使用BCC库来开发eBPF程序的步骤如下: 1. 导入BCC库。 2. 加载eBPF程序。 3. 使用attach_kprobe方法将BPF程序挂载到内核的探针上。 4. 使用trace_print方法读取内核调试文件的内容并打印到标准输出中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [eBPF学习笔记(二)—— eBPF开发工具](https://blog.csdn.net/qq_41988448/article/details/127813132)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [eBPF学习 - 入门](https://blog.csdn.net/hzb869168467/article/details/124239015)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值