kprobe_events shell模式使用教程

kprobe

使用前提

需要内核启用以下配置

CONFIG_KPROBES=y

CONFIG_HAVE_KPROBES=y

CONFIG_KPROBE_EVENT=y

kprobe_events

kprobe_events有两种类型:kprobe,kretprobe

kprobe_evnets规则添加的入口:/sys/kernel/debug/tracing/kprobe_events

  1. kprobe

    在函数调用时进行探测,可以用来判断函数是否被调用以及调用函数的传参值是什么.

    用法:

    echo "p:probe1 input_event type=%x1 code=%x2 value=%x3" > /sys/kernel/debug/tracing/kprobe_events
  2. kretprobe

    在函数调用完成后探测,可以用来判断函数执行的结果.

    用法:echo "r:probe2 input_event $retval" > /sys/kernel/debug/tracing/kprobe_events

用法说明:

p代表kprobe模式

r代表kretprobe模式

probe1,probe2为探测点的名称,可以任意命名

input_event被探测的函数

type,code,value自定义字段

%x1,%x2,%x3ARM架构下传参寄存器分别代表探测函数的第2,3,4个参数,用于给自定义字段赋值

$retval用于kretprobe模式,代表探测函数的返回值

如果有多个探测点可以将重定向>替换成追加>>

kprobe模式下如何查看探测函数参数列表中的结构体成员的值

例如:探测函数void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value),获取usage->hid,usage->type,usage->code的值,并根据hid过滤.

在kernel 4.4.131中:

struct hid_usage {
unsigned hid; /* hid usage code */
unsigned collection_index; /* index into collection array */
unsigned usage_index; /* index into usage array */
/* hidinput data */
__u16 code; /* input driver code */
__u8 type; /* input driver type */
__s8 hat_min; /* hat switch fun */
__s8 hat_max; /* ditto */
__s8 hat_dir; /* ditto */
}; 其中hid字段结构体内offset=0
code offset=12
type offset=14
echo "p:probeG6 hidinput_hid_event hid=+0(%x2):u32 type=+14(%x2):u8 code=+12(%x2):u16" >> /sys/kernel/debug/tracing/kprobe_events
echo "hid < 0x700e0 || hid > 0x700e7" > /sys/kernel/debug/tracing/events/kprobes/probeG6/filter

%x2获取hidinput_hid_event函数的第3个参数

+0(%x2)对第3个参数进行取值操作

:u32定义数据类型为u32,如果字段为字符串可定义为string

+14(%x2)先对第3个参数进行取值操作,然后+14个字节的偏移

filter

对探测结果进行条件过滤

echo "p:probe1 input_event type=%x1 code=%x2 value=%x3" > /sys/kernel/debug/tracing/kprobe_events
echo "type == 1" > /sys/kernel/debug/tracing/events/kprobes/probe1/filter

type == 1仅输出type值为1的条目,在kretprobe模式下也可以对探测函数的返回值进行过滤.

查看探测输出

cat /sys/kernel/debug/tracing/trace_pipe该操作会阻塞

kprobe输出字段的含义

                                                                                       # tracer: nop
#
# entries-in-buffer/entries-written: 0/0 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |

启动kprobe

echo "1" > /sys/kernel/debug/tracing/events/kprobes/enable

关闭kprobe

echo "0" > /sys/kernel/debug/tracing/events/enable
echo "" > /sys/kernel/debug/tracing/kprobe_events

kprobe_events shell模式使用教程的更多相关文章

  1. 用汇编语言(ARM 32位)编写TCP Bind Shell的菜鸟教程

    用汇编语言(ARM 32位)编写TCP Bind Shell的菜鸟教程 来源 https://www.4hou.com/info/news/9959.html Change 新闻 2018年1月19日 ...

  2. Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...

  3. VitualBox虚拟机安装CentOS, shell模式与图形化界面的相互切换

    方法一:永久切换 # vi /etc/inittab 编辑 init 5 为 init 3,重启就自动进入控制台方式:反之桌面模式 方法二:当前有效 桌面模式切换shell模式:Ctrl + Alt ...

  4. Shell编程基础教程5--文本过滤、正则表达式、相关命令

    5.文本过滤.正则表达式.相关命令    5.1.正则表达式(什么是正则表达式?正则表达式怎么进行匹配?常用命令)        简介:            一种用来描述文本模式的特殊语法      ...

  5. Shell编程基础教程4--控制流结构

    4.控制流结构    4.1.控制结构            4.2.if then else语句        格式: if 条件1 //如果条件1为真 then 命令1 //那么,执行命令1 el ...

  6. Jmeter(非GUI模式)教程

    前言 使用非 GUI 模式,即命令行模式运行 JMeter 测试脚本能够大大缩减所需要的系统资源.优点如下:1.节约系统资源:无需启动界面,节约系统资源 2.便捷快速:仅需启动命令行,输入命令便可执行 ...

  7. Linux shell 脚本入门教程+实例

    原文:http://www.wiquan.com/article/136 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是shell仍然是一个非常灵活的工具.She ...

  8. Shell脚本深入教程(1):快速入门

    Shell脚本基础入门 Bash注释 Bash只支持单行注释,使用#开头的都被当作注释语句: # 整行注释 echo hello world # 行尾注释 通过Bash的一些特性,可以取巧实现多行注释 ...

  9. Shell编程基础教程6--shell函数

    6.shell函数    6.1.定义函数        简介:            shell允许将一组命令集或语句形成一个可用块,这些块成为shell函数        定义函数的格式      ...

  10. Shell编程基础教程3--Shell输入与输出

    3.Shell输入与输出    3.1.echo        echo命令可以显示文本行或变量,或者把字符串输出到文件        echo [option] string             ...

随机推荐

  1. CSS必知必会

    CSS概念 css的使用是让网页具有统一美观的页面,css层叠样式表,简称样式表,文件后缀名.css css的规则由两部分构成:选择器以及一条或者多条声明 选择器:通常是需要改变的HTML元素 声明: ...

  2. java注解与反射--2

    java注解与反射--2 反射:java.Reflection 因为反射,使java具有了一定的动态性. java反射机制概述 动态语言: 是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至 ...

  3. do { } while(){ }

    1 var j=10; 2 do{ 3 console.log("十八岁以下禁止观看") 4 console.log(j); 5 j++; //j为18之前都不执行while 6 ...

  4. 二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可能第一时间更新 ...

  5. CentOS7.6静默安装19C实例脚本 ORA-27125 [FATAL] [DBT-10322]

    脚本: dbca -silent -createDatabase -templateName General_Purpose.dbc -gdbname test -sid test -characte ...

  6. 无法使用Resource注解

    问题描述: 学习Spring框架的时候,发现无法使用@Resource注解,只能使用@Autowired注解. 问题原因: JDK11删除了javax.annotation包,需要导入,否则无法使用@ ...

  7. vue3.0

    https://www.yuque.com/gdnnth/vue-v3 http://www.liulongbin.top:8085/#/ https://www.yuque.com/woniuppp ...

  8. Python OOP之继承封装多态

    面向对象的三大特征 继承 封装 多态 继承 子类可以使用父类定义的内容或者行为 继承的实现 父类,基类,超类,被继承的类,Base Class,Super Class 子类:有继承行为的类 所有类都必 ...

  9. [OpenCV-Python] 7 把鼠标当画笔

    文章目录 OpenCV-Python: II OpenCV 中的 Gui 特性 7 把鼠标当画笔 7.1 简单演示 7.2 高级一点的示例 OpenCV-Python: II OpenCV 中的 Gu ...

  10. Django的message组件(源码分析)

    Django的Message组件(源码分析) 1. 配置 # MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackS ...