场景
我们有一个如下的程序,希望能了解在程序的运行过程中,函数 `some_func` 的参数:
struct some_complex_struct {
int x;
long y;
short z;
};
long some_func(struct some_complex_struct *s)
{
return s->x + s->y + s->z;
}
int main()
{
struct some_complex_struct s = {
x: 1215,
y: 216,
z: 66,
};
while (1) {
long ret = some_func(&s);
printf("ret = %ld\n", ret);
sleep(1);
}
return 0;
}
可以看到,函数 `some_func` 有一个 `struct` 类型的参数,并且每隔一秒被调用一次。
当然,这只是一个假设的场景,你可以把这个程序换成 NGINX / MySQL 等,也是一样的。
解决方案
基于 libbpf 的方案是很直白的,如下:
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/* Copyright (c) 2022 Hengqi Chen */
struct params {
int xxx;
long yyy;
short zzz;
};
SEC("uprobe/user_func")
int BPF_KPROBE(uprobe, struct params *x)
{
struct params p = {};
bpf_probe_read_user(&p, sizeof(p), x);
bpf_printk("x = %d, y = %ld, z = %d\n", p.xxx, p.yyy, p.zzz);
return 0;
}
char LICENSE[] SEC("license") = "Dual BSD/GPL";
更多
关于上面这个简单的程序,我们还有很多问题还没解答:
bpf_probe_read_user 是什么,作用是什么 ?
BPF_KPROBE 是什么 ?
为什么定义了 `struct params` ?
SEC("uprobe/user_func") 是什么 ?
为什么需要 LICENSE ?
欲知后事如何,我们下一篇文章解答。