可以在函数中间打点了,以分析bpf_prog_load函数为例

可以在函数中间打点了,

sudo stap -L 'process("./test").statement("func@test.c:10")'

 //12.10更新

查看我内核中 bpf_prog_load 到底是位于哪一行,那么执行:

sudo sta -L 'kernel.statement("bpf_prog_load")',可以得到:

kernel.statement("bpf_prog_load@/build/linux-Ay7j_C/linux-4.4.0/kernel/bpf/syscall.c:605") $attr:union bpf_attr* $license:char[]

这样我就可以模仿上面的状态看看怎么使能bpf咯:

想看看在bpf的偏移10行能得到啥变量

记录一次对:bpf_prog_load函数的分析过程(我不想改内核重编,直接用kprobe去调试,夜太深,脑袋有点晕晕的,机械记录下来吧)

首先,找到内核的vmlinux:

/usr/lib/debug/boot/vmlinux-$(uname -r)

这个事先要下载好:

sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym

 然后查看函数的起始地址:readelf -s vmlinux | grep bpf_prog_load

hon@station6:~/codebox/lua$ readelf -s vmlinux | grep bpf_prog_load
 14710: ffffffff81172f90  1030 FUNC    LOCAL  DEFAULT    1 bpf_prog_load

辅助下用kprobe把这个函数的kprobe的addr打印出来,也是这个值,所以基本可以放心,0xffffffff81172f90 就是这个函数的起始地址了。

然后反汇编出这个函数:objdump -DSl --start-address=0xffffffff81172f90 --stop-adress=0xffffffff81173396 vmlinux > bpf_prog_load函数,然后反汇编出了400行汇编代码.

然后我们怎么从这些信息中看到函数进入到这个函数里的调用栈呢?\

这个函数经常出问题,反汇编了一份代码放在了这里:需要的时候再拿出来看:

https://github.com/honpey/codebox/commit/5b914f35af5a20e243f4a1f60d2f1f683eab2ba9

 我使用kprobe查看内核中注册了几种 bpf_prog 的type:在符号表看到链表的地址是:ffffffff81e65560 d bpf_prog_types

    printk("kp->addr:0x%x\n", (unsigned long)kp.addr);
    //0xffffffff81e65560 --> bpf_prog_types 
    // it is a list_head    
    struct list_head *p = 0xffffffff81e65560;
    struct bpf_prog_type_list *tl;
    list_for_each_entry(tl, p, list_node) {
        printk("tl->type: %d\n", tl->type);
    }
        

这样能看到所有注册的type, 返现问题所在了

是因为sys_bpf传入的type是5,但是这里只要12,3,4中类型,所以是因为没哟注册的累心哟,版本不匹配!

4.4版本中不支持tracepoint的type呀,累心累心,调了一天

 

转载于:https://www.cnblogs.com/honpey/p/7892522.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
bpf_prog_load_xattr是一个用于BPF程序加载的系统调用,它可以从文件系统中读取BPF程序的扩展属性(xattr)并将其加载到内核中。它的用法如下: ``` int bpf_prog_load_xattr(const char *file, enum bpf_prog_type type, struct bpf_prog_load_attr *attr, uint32_t *prog_fd) ``` 参数说明: - file:BPF程序的文件路径。 - type:BPF程序的类型,可以是BPF_PROG_TYPE_SOCKET_FILTER、BPF_PROG_TYPE_KPROBE等。 - attr:一个指向bpf_prog_load_attr结构体的指针,用于指定BPF程序的加载属性,如BPF程序的运行环境、BPF程序的最大大小等。 - prog_fd:一个指向uint32_t类型的指针,用于返回BPF程序的文件描述符。 示例代码: ``` #include <linux/bpf.h> #include <linux/filter.h> #include <bpf/bpf.h> int main(int argc, char **argv) { struct bpf_insn prog[] = {...}; // BPF程序的指令序列 struct bpf_prog_load_attr attr = { .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, .insns = prog, .insn_cnt = sizeof(prog) / sizeof(struct bpf_insn), .license = "GPL", }; uint32_t prog_fd; int ret = bpf_prog_load_xattr("./bpf_prog.o", BPF_PROG_TYPE_SOCKET_FILTER, &attr, &prog_fd); if (ret < 0) { perror("bpf_prog_load_xattr"); return -1; } return 0; } ``` 在上面的示例代码中,我们定义了一个BPF程序的指令序列,然后创建了一个bpf_prog_load_attr结构体,指定了BPF程序的类型、指令序列、指令数量和许可证。最后,我们调用了bpf_prog_load_xattr函数,将BPF程序加载到内核中,并获得了BPF程序的文件描述符。如果加载失败,函数将返回负数,我们需要通过perror函数打印出错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值