可以在函数中间打点了,以分析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呀,累心累心,调了一天
可以在函数中间打点了,以分析bpf_prog_load函数为例的更多相关文章
- 性能测试分享: Jmeter的源码分析main函数参数
性能测试分享: Jmeter的源码分析main函数参数 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...
- 31.C++-虚函数之构造函数与析构函数分析
1.构造函数不能为虚函数 当我们将构造函数定义为虚函数时,会直接报错: 首先回忆下以前学的virtual虚函数概念: 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存 ...
- 《linux内核分析》第六周:分析fork函数对应的系统调用处理过程
一. 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 进程是 ...
- jQuery源码分析-each函数
本文部分截取自且行且思 jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解: 复制代码代码 /*! * jQuer ...
- PHP 基础系列(三) 【转】PHP 函数实现原理及性能分析
作者:HDK (百度) 前言 在任何语言中,函数都是最基本的组成单元.对于PHP的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性 ...
- vue2源码分析:patch函数
目录 1.patch函数的脉络 2.类vnode的设计 3.createPatch函数中的辅助函数和patch函数 4.源码运行展示(DEMO) 一.patch函数的脉络 首先梳理一下patch函数的 ...
- LiteOS-任务篇-源码分析-任务调度函数
目录 前言 笔录草稿 核心源码分析 osTaskSchedule函数源码分析 osPendSV函数源码分析 TaskSwitch函数源码分析 调度上层源码分析 osSchedule函数源码分析 LOS ...
- javascript高级知识分析——定义函数
代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...
- 函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
一.适配器 三种类型的适配器: 容器适配器:用来扩展7种基本容器,利用基本容器扩展形成了栈.队列和优先级队列 迭代器适配器:(反向迭代器.插入迭代器.IO流迭代器) 函数适配器:函数适配器能够将仿函数 ...
随机推荐
- 5.vue解决动态img :src绑定
前言: 因为静态资源在vue中是需要经过编译的, 所以动态拼接的图片地址,在:src的时候不经过编译. 就会发生图片404,找不到资源. 那么本地图片资源如何动态的绑定呢? 实践: 其实,真相往往就是 ...
- swiper轮播始终居中active图片
用的是vue-awesome-swiper 在vue项目中,参数方法与swiper一致.使用场景如下: 左侧小图一共八张,默认显示的是三张,始终保持activeimg在中间,提升用户体验度.swipe ...
- 触发ionic弹窗区域外的方法
最近项目需要在页面弹窗的时候需要点击弹窗区域外的地方,其实也就是点击页面HTML就可以关闭弹窗, 首先在controller通过js获取到html的dom节点,然后绑定点击事件,话不多说上代码: ...
- [优化]Steamroller-freecodecamp算法题目
晚上在medium看到一篇关于找工作的文章,里面提到一个面试题目--flattening an array(扁平化数组).这我好像在哪看过!应该是freecodecamp里的算法某一题.翻了下博客记录 ...
- LeetCode700. Search in a Binary Search Tree
题目 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 例如, 给定二叉搜索树: 4 / \ 2 ...
- MappingException:class com.zsn.crm.Model.user not found whie looking for property user id
之前好好地运行 什么东西都没动过 再次运行突然报异常*****MappingException:class com.zsn.crm.Model.user not found whie looking ...
- CentOS7密码忘记解决方法&&GRUB菜单加密
CentOS7的root密码忘记怎么办 注意:该方法只适用于Linux7版本,可以用cat /redhat-release 查看 这里这里只介绍一种方法 1.启动的时候,在启动界面,相应启动项,内核名 ...
- Unity基础
unity unity 3大场景 Asset Scene Component Asset :资源导入导出 右击资源,选择导出Unity包 导入可以直接将只有复制到Asset文件夹 创建场景 File- ...
- Kernel list_head demo实现
内核中很多地方用到队列,如果每一个数据结构都实现一个双向队列,并针对这些数据结构实现对应的操作,那么代码将会非常冗余,于是内核抽象出了list_head数据结构,并文参考内核中的代码写成,实现了一个l ...
- Android内购订单验证 --- nodejs实现
主代码: function AndroidPlayVerify(inappPurchaseData, inappDataSignature) { let verify = crypto.createV ...