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探针上。
例如:
u = 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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
从GitHub中整理出来的15个最受欢迎的Python开源框架,你喜欢哪个
从GitHub中整理出的15个最受欢迎的Python开源框架。这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等。 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。 Diesel:基于Greenlet的事件I/O框架 Diesel提供一个整洁的API来编写网络客户端和服务器。支持TCP和UDP。 Flask:一个用Python编写的轻量级Web应用框架 Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask也被
- 下一篇
spark-submit报错:Exception in thread "main" java.sql.SQLException:No sui...
版权声明:本文由董可伦首发于https://dongkelun.com,非商业转载请注明作者及原创出处。商业转载请联系作者本人。 https://blog.csdn.net/dkl12/article/details/80256619 我的原创地址:https://dongkelun.com/2018/05/06/sparkSubmitException/ 前言 最近写了一个用spark连接oracle,然后将mysql所有的表保存到hive中的程序,在本地eclipse里运行没有问题,想在集群上跑一下,看看在集群上性能如何,但是用spark-submit 提交程序时抛出一个异常Exception in thread “main” java.sql.SQLException: No suitable driver,一开始以为spark-submit提交时找不到oracle 驱动jar,折腾了半天才发现是代码问题。 1、猜测是否是缺失oracle驱动 由于在本地没有问题,所以不会想到是代码问题,根据提示想到的是spark-submit找不到oracle驱动,因为maven或sbt仓库里没...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境