【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

之前一直对systemtap比较感兴趣,但是它的配置太麻烦,使用起来有点不是很顺手。今天偶然之中发现了kprobe,发现很是不错。对我而言,使用kprobe的最大好处就是可以不用重新编译内核就可以学习各个函数之间的调用关系。kprobe的实现原理不复杂,就是在对应的函数设置异常断点,这样可以让函数进入中断,在中断中通过类似信号函数的处理手法,让它先执行我们设定的函数,等到一切结束后再继续原来的流程。它的使用也十分简单,在kernel下有一份简单的代码,大家可以看看。

/** NOTE: This example is works on x86 and powerpc.* Here's a sample kernel module showing the use of kprobes to dump a* stack trace and selected registers when do_fork() is called.** For more information on theory of operation of kprobes, see* Documentation/kprobes.txt** You will see the trace data in /var/log/messages and on the console* whenever do_fork() is invoked to create a new process.*/#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kprobes.h>/* For each probe you need to allocate a kprobe structure */
static struct kprobe kp = {.symbol_name    = "do_fork",
};/* kprobe pre_handler: called just before the probed instruction is executed */
static int handler_pre(struct kprobe *p, struct pt_regs *regs)
{
#ifdef CONFIG_X86printk(KERN_INFO "pre_handler: p->addr = 0x%p, ip = %lx,"" flags = 0x%lx\n",p->addr, regs->ip, regs->flags);
#endif
#ifdef CONFIG_PPCprintk(KERN_INFO "pre_handler: p->addr = 0x%p, nip = 0x%lx,"" msr = 0x%lx\n",p->addr, regs->nip, regs->msr);
#endif
#ifdef CONFIG_MIPSprintk(KERN_INFO "pre_handler: p->addr = 0x%p, epc = 0x%lx,"" status = 0x%lx\n",p->addr, regs->cp0_epc, regs->cp0_status);
#endif/* A dump_stack() here will give a stack backtrace */return 0;
}/* kprobe post_handler: called after the probed instruction is executed */
static void handler_post(struct kprobe *p, struct pt_regs *regs,unsigned long flags)
{
#ifdef CONFIG_X86printk(KERN_INFO "post_handler: p->addr = 0x%p, flags = 0x%lx\n",p->addr, regs->flags);
#endif
#ifdef CONFIG_PPCprintk(KERN_INFO "post_handler: p->addr = 0x%p, msr = 0x%lx\n",p->addr, regs->msr);
#endif
#ifdef CONFIG_MIPSprintk(KERN_INFO "post_handler: p->addr = 0x%p, status = 0x%lx\n",p->addr, regs->cp0_status);
#endif
}/** fault_handler: this is called if an exception is generated for any* instruction within the pre- or post-handler, or when Kprobes* single-steps the probed instruction.*/
static int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr)
{printk(KERN_INFO "fault_handler: p->addr = 0x%p, trap #%dn",p->addr, trapnr);/* Return 0 because we don't handle the fault. */return 0;
}static int __init kprobe_init(void)
{int ret;kp.pre_handler = handler_pre;kp.post_handler = handler_post;kp.fault_handler = handler_fault;ret = register_kprobe(&kp);if (ret < 0) {printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);return ret;}printk(KERN_INFO "Planted kprobe at %p\n", kp.addr);return 0;
}static void __exit kprobe_exit(void)
{unregister_kprobe(&kp);printk(KERN_INFO "kprobe at %p unregistered\n", kp.addr);
}module_init(kprobe_init)
module_exit(kprobe_exit)
MODULE_LICENSE("GPL");

当然,为了大家使用方便,这里一起把Makefile附上,希望大家用的愉快。

ifneq ($(KERNELRELEASE),)
obj-m := kprobe_example.oelse
PWD  := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.*  Module.*
endif

ps:

类似的工具还有ftrace,https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace1/index.html & https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace2/

随想录(强大的kprobe)相关推荐

  1. linux 内核 调试工具介绍

    1 内核调试以及工具总结 内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为此内核开发者为我们提供了一系列的工具和系统来支持内核的调试. 内核的调试, 其本质是内核空间与用 ...

  2. kprobe原理解析

    参考  http://www.cnblogs.com/honpey/p/4575928.html kprobe是linux内核的一个重要特性,是一个轻量级的内核调试工具,同时它又是其他一些更高级的内核 ...

  3. Linux内核调试原理和工具介绍--理解静态插装/动态插装、tracepoint、ftrace、kprobe、SystemTap、Perf、eBPF

    可以将linux跟踪系统分成Tracer(跟踪数据来自哪里),数据收集分析(如"ftrace")和跟踪前端(更方便的用户态工具). 1. 数据源(Tracers) printk 是 ...

  4. [转载] kprobe原理解析(一)

    From: https://www.cnblogs.com/honpey/p/4575928.html kprobe原理解析(一) kprobe是linux内核的一个重要特性,是一个轻量级的内核调试工 ...

  5. 强大的MATLAB机器人工具箱Matlab_Robotic_Toolbox_v9.8及教程

    强大的MATLAB机器人工具箱Matlab_Robotic_Toolbox_v9.8及教程 Matlab_Robotic_Toolbox_v9.8是一个功能强大的机器人工具箱,包含了机器人正.逆向运动 ...

  6. 一刷代码随想录完结篇

    一刷代码随想录完结篇 机缘 收获 憧憬 机缘 今天是4月16日,遇到宝藏Carl老师已有两个月.仍记得第一天知道Carl老师时,心里的那份激动与忧虑,激动是因为Carl老师的创作-代码随想录以及配套的 ...

  7. 窗口键 键位码_键盘上这些被冷落的键位居然有这么强大的功能

    各位小伙伴们大家好啊,又到了达尔优外设小课堂时间了,今天呢,我们将为大家带来的是键盘上的功能区按键小科普,也就是我们常说的F区按键. F区按键 F1~F12这个区域的按键我们通常称为功能键,而F的意思 ...

  8. iterm2 主题_【超级实用】Iterm2 + ohmyzsh 打造强大的终端编辑器

    作者:AndrewHR 地址:http://mrw.so/4D1n7B 最终的效果图如下所示:使用iterm2配合oh-my-zsh的命令行,拥有语法高亮.命令自动补全.自动提示符.显示git仓库状态 ...

  9. sklearn库安装_没有依赖库也能跑机器学习模型!推荐一个强大工具m2cgen

    晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI m2cgen(Model 2 Code Generator)是一个轻量级代码生成器,它可以将训练好的机器学习模型转换成无需依赖库的本地代码. ...

最新文章

  1. 浏览器中可以运行Window2000,WebAssembly 是 JavaScript 的末日?
  2. 面试必过之Mongdodb数据库面试题总结大全!
  3. 在java中开发图形用户_2016年计算机二级考试《JAVA》习题:编写图形用户界面
  4. Android数据库文件的导出
  5. 异形3×3魔方还原教程_【理论篇】三阶魔方4.33千亿亿种变化是怎么计算出来的?...
  6. IntelliJ IDEA在行尾增加分号
  7. 【Java架构师】JVM性能优化(一)JVM技术入门下
  8. 国内PHP,ASP免费开源的CMS介绍
  9. oracle+in+多,Oracle in子句过多的硬编码引发的故障
  10. 什么是CMMI资质认证?
  11. 电子科大《模拟集成电路分析与设计》(罗萍)2020期末考试重难点整理
  12. 微信小程序 上传图片(多张/单张)
  13. 电脑浏览器打不开html文档,电脑浏览器打不开本地html文件
  14. e签宝:借助钉钉宜搭变革传统项目管理模式,交付效率显著提升
  15. 抖音5×5一笔连线问题无解的证明
  16. CSDN浏览器助手又双叒叕更新啦,来体验下都更新了什么
  17. 使用BetterScroll封装页面滚动及轮播图组件(一文入门移动端页面滚动神器BetterScroll)
  18. 计算机数据库基础知识填空题,数据库练习题(基础)
  19. 无人驾驶传感器之GPS和IMU
  20. 区分Internet和Local数据流的Qos实现

热门文章

  1. 【293天】我爱刷题系列052(2017.11.25)
  2. linux系统下的权限知识梳理
  3. 短视频技术指南:国内最牛5家短视频解决方案提供
  4. 【个性化阅读】ZapTxt的提醒姗姗来迟
  5. HTML5学习笔记简明版(11):新API
  6. 取得浏览器当前鼠标的X,Y坐标的JavaScript脚本及document元素的一些重要属性
  7. xml文件中若没有子节点,则删除文件
  8. 剑指Offer——和为s的两个数字
  9. 在Jenkins远程链接Linux系统,然后执行shell命令-亲测可用【转】
  10. Mom and Dad