浅析Linux追踪技术之kprobe:基于kprobes的Event Tracing

文章目录

概述

常规的Event Tracing(事件追踪)是通过散落在Linux内核代码各处的Tracepoint来实现的,这些Tracepoint数量有限,在出现问题时,往往不能覆盖到要追踪的函数;而利用kprobes机制,则可以实现对所有支持kprobes插入的代码点进行追踪。这种方式是 kprobe 和 ftrace 结合使用,通过 kprobe 来优化 ftrace 来跟踪函数的调用。

内核选项配置

为了使能基于kprobes进行Event Tracing,需要配置内核选项:CONFIG_KPROBE_EVENTS,如下:

ftrace配置接口

ftrace通过debugfs/tracefs提供配置接口,其中与kprobe相关的文件如下:

  • /sys/kernel/debug/tracing/kprobe_events:用于配置kprobe事件,新增的事件会在kprobes目录下生成对应的事件目录;
  • /sys/kernel/debug/tracing/events/kprobes/<EVENT>/enable:使能/禁用kprobes事件;
  • /sys/kernel/debug/tracing/kprobe_profile:kprobe事件统计

kprobe事件配置

kprobe使用/sys/kernel/debug/tracing/kprobe_events文件配置kprobe事件,设置方法如下:

  • 添加kprobe探测点:echo 'p[:[GRP/]EVENT] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS]' > kprobe_events
  • 添加kretprobe探测点:echo 'r[:[GRP/]EVENT] [MOD:]SYM[+0] [FETCHARGS]' > kprobe_events
  • 删除指定的探测点:echo '-:[GRP/]EVENT' > kprobe_events
  • 删除所有的探测点:echo > kprobe_events

对于配置内容的各个字段解释如下:

  • GRP:Group名称,指定后会在events/kprobes/下生成目录;
  • EVENT:Event名称,指定后会在events/kprobes//下生成目录;
  • MOD:被探测的模块名;
  • SYM[+offs]:被探测的函数名以及偏移;
  • MEMADDR :指定被探测的内存地址;
  • FETCHARGS :获取参数信息
    • %REG:获取指定寄存器的值,REG取决于当前的处理器体系架构,如x86_64下,可以为rax、rsp等;
    • @ADDR:获取指定内存地址的值;
    • @SYM[+|-offs]:获取指定符号偏移内存的内容;
    • $stackN:获取第N个栈地址
    • $stack:获取栈地址;
    • $argN:获取第N个参数的值(N >= 1);
    • $retval:获取函数返回值,仅支持kretprobe探测点;
    • $comm:获取当前任务的comm字段值;

使用示例

添加kprobes事件

通过向kprobe_events文件写入指定格式的字符串,可以添加kprobes事件:

复制代码
echo 'p:kprobe_submit_bio submit_bio bio=%x0' > kprobe_events
echo 'r:kretprobe_submit_bio submit_bio ret=$retval' >> kprobe_events

添加事件完成后,cat kprobe_events可以看到新添加的kprobe事件:

同时在/sys/kernel/debug/tracing/events/kprobes/目录下,可以看到刚刚创建的两个kprobe trace evens:

kprobes事件使能

kprobe事件添加后,后面就可以按照trace events的方法来控制对应的事件了,如果要使能特定的kprobe事件:

复制代码
echo 1 > /sys/kernel/debug/tracing/events/kprobes/kprobe_submit_bio/enable
echo 1 > /sys/kernel/debug/tracing/events/kprobes/kretprobe_submit_bio/enable

通过/sys/kernel/debug/tracing/trace文件查看事件触发信息:

kprobes事件统计

kprobe可以通过/sys/kernel/debug/tracing/kprobe_profie查看kprobe事件触发的统计情况:

最后两列分别表示命中和未命中的次数。

参考链接

相关推荐
JZC_xiaozhong5 小时前
数据不互通、审批慢?企业多系统智能协同与流程自动化解决方案
运维·自动化·流程管理·流程自动化·数据集成与应用集成·流程监控·流程可视化设计
爱学习的小囧5 小时前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
坚持就完事了6 小时前
Linux中的变量
linux·运维·服务器
hERS EOUS6 小时前
nginx 代理 redis
运维·redis·nginx
handler016 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
Cat_Rocky6 小时前
利用Packet Tracer网络实验
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志7 小时前
Linux 驱动实战:SR501 人体红外传感器驱动开发与调试全记录
linux·运维·驱动开发
正点原子7 小时前
【正点原子Linux连载】第三章 U-Boot使用 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
Qbw20047 小时前
【Linux】进程地址空间
linux·c++
忍冬行者7 小时前
MongoDB 三节点副本集离线部署运维手册
运维·数据库·mongodb