推文详情
avatar
@dantezy@dabr.ca
我要夫子自道地卖一下广告:

dust

一个抄 pwru 的 ebpf 小工具,主要作用就是跟踪一个 io request 的生命周期。别的不说,能省一点穿越层层调用链看调用次序。

github.com/dantesli...
查看详情

GitHub

GitHub - danteslimbo/dust

Contribute to danteslimbo/dust development by creating an account on GitHub.

0
0
1
avatar
@dantezy@dabr.ca
加上了 github action

t.me/danteslimbo/3277
查看详情

Telegram

Dante's Limbo

#ebpf #dust 给 dust 加上了 github action: https://github.com/danteslimbo/dust/actions/workflows/makefile.yml 有空继续抄 #pwru

0
0
1
avatar
@dantezy@dabr.ca
github.com/dantesli...

整了个 release 页。
查看详情

GitHub

Release v0.0.2 · danteslimbo/dust

0
0
1
avatar
@dantezy@dabr.ca
t.me/danteslimbo/3327

dust 抄了 purw 拿 probed 函数的方法:从 ip 寄存器里面拿指令地址,再用指令地址从符号表反查函数名。

但这方法放 blk_mq_alloc_request 不灵了,因为这里挂的是 kretprobe ,ip 的地址指向 kretprobe_trampoline. 昨天拿 bpftrace 琢磨了半天,把所有寄存器都打出来看了一下,最后还是不知道怎样拿到 blk_mq_alloc_request 的地址。

不过我倒是学了一点别的伎俩:

1. bpftrace 有一个 --emit-elf 参数,可以把 bpftrace script 导出成 elf 文件,然后就可以用 llvm-objdump 分析了。
2. bpftrace 的 print 其实用了一个 perf_event 往外吐数据。

回到 dust 我决定先用 addr = 0 标注这是从 blk_mq_alloc_request 返回的事件,先糊弄过去了。

github.com/dantesli...
查看详情
0
0
1
avatar
@dantezy@dabr.ca
#bpftrace #ebpf

t.me/danteslimbo/3336

周末开始想一个问题:在 kretprobe 里面怎样获取 probed 函数的名字。见 t.me/danteslimbo/3327

首先 bpf_get_func_ip 和 PR_REGS_IP 都不行(实测)。

第二个思路就是把所有寄存器都打出来看看,看有哪个寄存器存了可用的地址,用来算出 probed 函数的地址——并没有。

Nameless One 给了一个思路:在 kprobe 的时候存一下地址,在 kretprobe 的时候读出来,我觉得这是正路,但是有点麻烦,后面我把 bio 也做进来再采用这种办法吧。

还有第三个思路就是看 bpftrace 的 probe 看它怎样实现的。当时我以为 bpftrace 也是通过 offset 算地址的思路,所以对着 bpftrace --emit-elf 的 bpf 汇编算了半天,还学了一下如何直接写汇编 ebpf t.me/danteslimbo/3330

昨天想了一下,去看 bpftrace 的翻译出来的 ebpf 内容(用 -dd),把翻译出来 llvm IR 扔进 chatgpt 里面,发现它定义了一个 printf_t 结构体,然后往这个结构体里面写满0,就从 perf_event_output 扔出来,更加迷茫了。

当然 Nameless One 很快找到正确的答案了(此处有掌声)。

看一下

shell

bpftrace -dd -e 'kretprobe:blk_put_request,kretprobe:blk_mq_free_request, kretprobe:blk_mq_alloc_request { printf("%s\n", probe); }'

的结果就会知道答案,简单来说,这里 probed 了三个 kretprobe, bpftrace 会生成三个 prog,在里面给 printf_t 赋值为 {0,0}, {1,0}, {2,0}, 然后在用户态把这个硬编码翻译回来。

哎。
查看详情
0
0
1
@dantezy@dabr.ca
0/483
加载中