Appearance
BPF 相关文档
https://docs.kernel.org/bpf/index.html
BPF 和 eBPF 的区别
https://docs.kernel.org/bpf/classic_vs_extended.html
- 寄存器从 2 增加到 10
- 寄存器从 32 位增加到 64 位
- 判断条件 jt/if 替换为 jt/fall-through
- 引入 bpf_call insn 和寄存器传递约定,以实现来自/向其他内核函数的零开销调用
bcc 就是 BPF 脚本工具集
- 手动 clone 源码编译安装,不要使用
apt
或者yum
等命令源安装
bash
USDT probes (User Statically-Defined Tracing)
用户静态定义的追踪探测,程序编译时需要开启动态追踪,用户态程序静态定义的跟踪点,类似于内核中的 tracepoint,它需要在程序的源代码中添加代码。编译器会将DTRACE_PROBEXXX
这种宏替换为一个 nop 空指令,不做其它的事情,只负责占位,同时编译器会在程序的.note.stapsdt
中添加必要的信息。
c
#include <sys/>std.h>
int main(int argc, char const *argv[]) {
DTRACE_PROBE(hello-usdt, probe-main);
return 0;
}
c
int do_trace(struct pt_regs *ctx) {
uint64_t addr;
char path[128];
bpf_usdt_readarg(6, ctx, &addr);
bpf_probe_read_user(&path, sizeof(path), (void *)addr);
bpf_trace_printk("path:%s\\n", path);
return 0;
};
系统事件
探针
内核探针
kprobes 探针,内核函数入口被调用
kretprobes 探测点在内核函数返回时后被调用
用户空间探针
uprobes 用户空间函数入口探针
- 需要手动计算进程内存的偏移位置,不可移植
- 查看
redis-server
符号表
bash
objdump -tT /usr/local/bin/redis-server
# but isn't work
sudo python ~/work/go-dev/bcc/tools/trace.py '/usr/local/bin/redis-server:createStringObject "%s" arg1'
查看函数参数
bash
dd@dd-OptiPlex-3020:~$ sudo bpftrace -lv 'uprobe:/usr/local/bin/php:compile_string'
WARNING: Cannot parse DWARF: libdw not available
WARNING: No DWARF found for "/usr/local/bin/php", cannot show parameter info
uprobe:/usr/local/bin/php:compile_string
uprobe
- 语法
uprobe: arg0, arg1, ..., argN
uretprobe: retval
bash
sudo bpftrace -e 'uprobe:/lib/x86_64-linux-gnu/libc.so.6:fopen { printf("fopen: %s\n", str(arg0)); }'
Attaching 1 probe...
fopen: /proc/meminfo
fopen: /proc/meminfo
查看追踪点
bash
sudo tplist-bpfcc
eBPF in Rust
- aya
什么是 DWARF?
译文来自https://www.deepl.com/translator
DWARF is a widely used, standardized debugging data format. DWARF was originally designed along with Executable and Linkable Format (ELF), although it is independent of object file formats.[1] The name is a medieval fantasy complement to "ELF" that had no official meaning, although the backronym "Debugging With Arbitrary Record Formats" has since been proposed.[1]
DWARF 是一种广泛使用的、标准化的调试数据格式。DWARF 最初是与可执行和可链接格式(ELF)一起设计的,尽管它独立于对象文件格式。[1]这个名字是对 "ELF "的中世纪幻想的补充,没有正式的含义,尽管后来有人提出了 "用任意记录格式进行调试 "的后缀名。
eBPF 实现原理
todo