LightWeight CoolBPF reference

lwcb 参考手册

1. 使用说明

单行命令

lwcb -t 可以直接运行单条命令形式的 eBPF 程序,如:

lwcb -t 'kprobe:tcp_rcv_established {print("%s :triggerred by tcp_rcv_established\n", timestr(ns()));}'

lwcb 脚本

lwcb <脚本路径> 可以运行 lwcb 脚本

2. 语法说明

lwcb 的语法和 c 语言非常类似,

  • { } : 是一个代码块

  • // :是注释

  • “string” :是字符串

  • -> 或 .:取结构体成员

  • `` if {} else {} ``:if 语句

  • return:返回语句

  • []:数组索引或者是 eBPF map 查找

3. 探测类型

目前支持的探测类型有:

  • k(ret)probe: BPF_PROG_TYPE_KPROBE

后续需要支持的探测类型有:

  • tracepoint: BPF_PROG_TYPE_TRACEPOINT

  • raw tracepoint:BPF_PROG_TYPE_RAW_TRACEPOINT

  • syscall: BPF_PROG_TYPE_SYSCALL

  • perf event:BPF_PROG_TYPE_PERF_EVENT

4. MAP 类型

目前支持的 eBPF map 类型有:

  • BPF_MAP_TYPE_PERF_EVENT_ARRAY

  • BPF_MAP_TYPE_HASH

后续需要支持的 eBPF map 类型有:

  • BPF_MAP_TYPE_ARRAY

  • BPF_MAP_TYPE_PERCPU_HASH

  • BPF_MAP_TYPE_PERCPU_ARRAY

  • BPF_MAP_TYPE_RINGBUF: 如果内核版本支持 ringbuffer 的话,我们应该用 ringbuffer 替代 perf buffer

5. 内置函数

print

语法: print(fmt, args)

iphdr

语法: iphdr(skb)

tcphdr

语法: tcphdr(skb)

ntop

语法: ntop(i32 addr)

bswap

语法: bswap(u8 | i8 | u16 | i16 | u32 | i32 | u64 | i64)

kstack

语法: kstack(i32 depth) | kstack()

ns

语法: ns()

pid

语法: pid()

tcpstate

语法: tcpstate(i32 tcpstate)

tcpflags

语法: tcpstate(i32 tcpflags)

timestr

语法: timestr(u64 ts)

ksym

语法: ksym(u64 kernel_address)

reg

语法: reg(string)

6. 内置常量

linux 内核包含了大量的宏常量,比如 #define IPPROTO_TCP 6 。 为此,lwcb 也提供了这些宏常量,使得 用户在写 lwcb 脚本代码时,能够用到内核常用的宏常量。目前已经支持的宏常量如下:

  • IPPROTO_IP

  • IPPROTO_TCP

  • IPPROTO_ICMP

  • IPPROTO_UDP

也欢迎大家贡献更多的宏常量,相关代码请参考:lwcb/src/cmacro.rs