zoukankan      html  css  js  c++  java
  • 可以在函数中间打点了,以分析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
    ", (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
    ", tl->type);
        }
            
    

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

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

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

     

  • 相关阅读:
    python之路day08--文件的操作
    python之路day07-集合set的增删查、列表如何排重(效率最高的方法)、深浅copy
    python之路day06-python2/3小区别,小数据池的概念,编码的进阶str转为bytes类型,编码和解码
    python之路day05--字典的增删改查,嵌套
    python之路day04--列表的增删改查,嵌套、元组的嵌套、range、for循环嵌套
    python之路day03--数据类型分析,转换,索引切片,str常用操作方法
    python之路day02--格式化输出、初始编码、运算符
    python之路day01--变量
    线程、进程、协程 异步io
    Ubuntu学习(转载)
  • 原文地址:https://www.cnblogs.com/honpey/p/7892522.html
Copyright © 2011-2022 走看看