Kprobe
linux内核源码Documentation目录下存在kprobe介绍文档如下
Kprobes allows multiple probes at the same address. Currently,
however, there cannot be multiple jprobes on the same function at
the same time.
If you install a probe in an inline-able function, Kprobes makes
no attempt to chase down all inline instances of the function and
install probes there. gcc may inline a function without being asked,
so keep this in mind if you're not seeing the probe hits you expect.
A probe handler can modify the environment of the probed function
-- e.g., by modifying kernel data structures, or by modifying the
contents of the pt_regs struct (which are restored to the registers
upon return from the breakpoint). So Kprobes can be used, for example,
to install a bug fix or to inject faults for testing. Kprobes, of
course, has no way to distinguish the deliberately injected faults
from the accidental ones. Don't drink and probe.
Kprobes makes no attempt to prevent probe handlers from stepping on
each other -- e.g., probing printk() and then calling printk() from a
probe handler. If a probe handler hits a probe, that second probe's
handlers won't be run in that instance, and the kprobe.nmissed member
of the second probe will be incremented.
Kprobes does not use mutexes or allocate memory except during
registration and unregistration.
/sys/kernel/debug/kprobes
crash> gdb disass /r tcp_v4_rcv #加载了tcp_debug模块 jprobe
Dump of assembler code forfunction tcp_v4_rcv:
0xffffffff81782980<+0>: e8 7b c6 893e callq 0xffffffffc001f000
0xffffffff81782985<+5>: 55 push %rbp
0xffffffff81782986<+6>: 4889 e5 mov %rsp,%rbp
0xffffffff81782989<+9>: 4157 push %r15
0xffffffff8178298b<+11>: 4156 push %r14
0xffffffff8178298d<+13>: 4155 push %r13
0xffffffff8178298f<+15>: 4154 push %r12
0xffffffff81782991<+17>: 53 push %rbx
0xffffffff81782992<+18>: 4889 fb mov %rdi,%rbx
0xffffffff81782995<+21>: 4883 ec 60 sub $0x60,%rsp
crash>
crash> gdb disass /r tcp_v4_rcv #卸载tcp_debug模块 jprobe
Dump of assembler code forfunction tcp_v4_rcv:
0xffffffff81782980<+0>: 6666666690 data32 data32 data32 xchg %ax,%ax
0xffffffff81782985<+5>: 55 push %rbp
0xffffffff81782986<+6>: 4889 e5 mov %rsp,%rbp
0xffffffff81782989<+9>: 4157 push %r15
0xffffffff8178298b<+11>: 4156 push %r14
0xffffffff8178298d<+13>: 4155 push %r13
0xffffffff8178298f<+15>: 4154 push %r12
0xffffffff81782991<+17>: 53 push %rbx
0xffffffff81782992<+18>: 4889 fb mov %rdi,%rbx
0xffffffff81782995<+21>: 4883 ec 60 sub $0x60,%rsp
crash>
(gdb) disass /r tcp_v4_rcv #vmlinux中原始文件反汇编
Dump of assembler code forfunction tcp_v4_rcv:
0xffffffff81782980<+0>: e8 ab 9f0a00 callq 0xffffffff8182c930<__fentry__>
0xffffffff81782985<+5>:55 push %rbp
0xffffffff81782986<+6>:4889 e5 mov %rsp,%rbp
0xffffffff81782989<+9>:4157 push %r15
0xffffffff8178298b<+11>:4156 push %r14
0xffffffff8178298d<+13>:4155 push %r13
0xffffffff8178298f<+15>:4154 push %r12
0xffffffff81782991<+17>:53 push %rbx
0xffffffff81782992<+18>:4889 fb mov %rdi,%rbx
0xffffffff81782995<+21>:4883 ec 60 sub $0x60,%rsp
0xffffffff81782999<+25>: f6 879000000007 testb $0x7,0x90(%rdi)
0xffffffff817829a0<+32>:7556 jne 0xffffffff817829f8<tcp_v4_rcv+120>
crash> gdb disass /r jprobe_return
Dump of assembler code forfunction jprobe_return:
0xffffffff8105dcc0<+0>: 6666666690 data32 data32 data32 xchg %ax,%ax
0xffffffff8105dcc5<+5>: 55 push %rbp
0xffffffff8105dcc6<+6>: 48 c7 c0 a0 d7 0000 mov $0xd7a0,%rax
0xffffffff8105dccd<+13>: 4889 e5 mov %rsp,%rbp
0xffffffff8105dcd0<+16>: 53 push %rbx
0xffffffff8105dcd1<+17>: 65480305 af c4 fa 7e add %gs:0x7efac4af(%rip),%rax # 0xa188
0xffffffff8105dcd9<+25>: 488b5818 mov 0x18(%rax),%rbx
0xffffffff8105dcdd<+29>: 4887 dc xchg %rbx,%rsp
0xffffffff8105dce0<+32>: cc int3
0xffffffff8105dce1<+33>: 90 nop
0xffffffff8105dce2<+34>: 5b pop %rbx
0xffffffff8105dce3<+35>: 5d pop %rbp
0xffffffff8105dce4<+36>: c3 retq
End of assembler dump.
对tcp_ack中0xffffffff817748bf位置进行kprobe前后对比
通过/proc/kallsyms查看的文件类型对应如下(./scripts/mksysmap):
# The second row specify the type of the symbol:
# A = Absolute
# B = Uninitialised data (.bss)
# C = Common symbol
# D = Initialised data
# G = Initialised data for small objects
# I = Indirect reference to another symbol
# N = Debugging symbol
# R = Read only
# S = Uninitialised data for small objects
# T = Text code symbol
# U = Undefined symbol
# V = Weak symbol
# W = Weak symbol
# Corresponding small letters are local symbols
# For System.map filter away:
# a - local absolute symbols
# U - undefined global symbols
# N - debugging symbols
# w - local weak symbols
__kstrtab节(保存符号名)、__ksymtab节(所有模块可使用的符号地址)和__ksymtab_gpl节(GPL兼容许可证下发布的模块可以使用的符号地址,其他的未找到
cat /proc/kallsyms | cut -d " "-f 2| sort -u //查看文件类型
cat /proc/kallsyms | awk '$2=="a" {print $2 "\t" $3}' //查看某个文件类型对应的符号
附件列表
Kprobe的更多相关文章
- 哎呀,发现自己不会用模块的方式用kprobe啊,弱爆了
在内核外面编译模块,会报warning函数名undefined的错误,解决方法是把函数给export出来:EXPORT_SYMBOL 一直以来,用kprobe比较多的是kprobe event的用法, ...
- kprobe原理解析(二)
上一篇文章和大家简要说明了下kprobe到底应该怎样用,那么现在我们就揭开kprobe神秘的面纱,刨根问底,一睹kprobe的庐山真面目. kprobe的工作过程大致如下: 1)注册kprobe.注册 ...
- kprobe原理解析(一)
kprobe是linux内核的一个重要特性,是一个轻量级的内核调试工具,同时它又是其他一些更高级的内核调试工具(比如perf和systemtap)的“基础设施”,4.0版本的内核中,强大的eBPF特性 ...
- kprobe 内核模块
代码来自于linux内核sample/kprobe kprobe_example.c /* * NOTE: This example is works on x86 and powerpc. * He ...
- Linux 下的一个全新的性能测量和调式诊断工具 Systemtap,第 1 部分: kprobe
kprobe 的原理.编程接口.局限性和使用注意事项 本系列文章详细地介绍了一个Linux下的全新的调式.诊断和性能测量工具Systemtap和它所依赖的基础kprobe以及促使开发该工具的先驱DTr ...
- Linux kprobe调试技术使用
kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术. 利用kprobe技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程. kpr ...
- kprobe原理解析
参考 http://www.cnblogs.com/honpey/p/4575928.html kprobe是linux内核的一个重要特性,是一个轻量级的内核调试工具,同时它又是其他一些更高级的内核 ...
- [转载] kprobe原理解析(一)
From: https://www.cnblogs.com/honpey/p/4575928.html kprobe原理解析(一) kprobe是linux内核的一个重要特性,是一个轻量级的内核调试工 ...
- Linux下 kprobe工具的使用
此处转载: 一.Kprobe简单介绍 kprobe是一个动态地收集调试和性能信息的工具,它从Dprobe项目派生而来,是一种非破坏性工具,用户用它差点儿能够跟踪不论什么函数或被运行的指令以及一些异步事 ...
随机推荐
- curl下载文件
* curl下载文件* 根据业务需求* 通过不同站点去访问路径* 下载文件* 但是不同站点需要设置header头* 这里使用curl方式下载* 具体看代码: //下载地址 $url = 'https: ...
- Spark运行模式_本地伪集群运行模式(单机模拟集群)
这种运行模式,和Local[N]很像,不同的是,它会在单机启动多个进程来模拟集群下的分布式场景,而不像Local[N]这种多个线程只能在一个进程下委屈求全的共享资源.通常也是用来验证开发出来的应用程序 ...
- Linux GPIO键盘驱动开发记录_OMAPL138
Linux GPIO键盘驱动开发记录_OMAPL138 Linux基本配置完毕了,这几天开始着手Linux驱动的开发,从一个最简单的键盘驱动开始,逐步的了解开发驱动的过程有哪些.看了一下Linux3. ...
- 爬虫-scrapy五大核心组件及工作流
- Python 爬虫 招聘信息并存入数据库
新学习了selenium,啪一下腾讯招聘 from lxml import etree from selenium import webdriver import pymysql def Geturl ...
- NUCLEO-L053R8 TIM定时器 PWM输出
TIM2 PWM输出测试 今天给大伙分享一个TIM2 PWM输出小实验. 实验开发板:Nucleo-L053R8,即STM32L053R8T6. 开发环境:MDK5 图1 - 工程界面 本次实验测试的 ...
- yii2 shi用modal弹窗 select2搜索框无法使用
在modal使用begin的时候指定options选项的tabindex为false Modal::begin([ // ...... 'options' => [ 'tabindex' =&g ...
- html5新特性与用法大全了解一下
有好多小伙伴私聊我问我html5新特性 和用法,下面我给大家具体介绍一下html5都新加了哪些新特性,下面我给大家总结一下. 1)新的语义标签 footer header 等等2)增强型表单 表单2. ...
- Spring Cloud 熔断机制 -- 断路器
Spring Cloud 入门教程(七): 熔断机制 -- 断路器 对断路器模式不太清楚的话,可以参看另一篇博文:断路器(Curcuit Breaker)模式,下面直接介绍Spring Cloud的断 ...
- 手机蓝牙APP扫描设备的时候异常断开(未完成)
1.手机蓝牙APP打开立马就出现异常,测试在公司有这个问题,在宿舍没这个问题,怀疑是公司设备太多,导致扫描空间不够,或者扫描到奇怪的设备.数组越界之类,明天用log看一下 2. 看样子出了一个erro ...