Linux动态观测神器bpftrace的5种探针、7个常见内置变量和常见操作?

devtools/2024/10/18 23:14:14/

文章目录

  • 简介
  • 5种探针
  • 内置变量:
  • 安装
  • 实操
    • 内核态:
    • 返回值:
    • 多个函数
    • 用户态
    • if语句
    • 查看支持的观测点
  • 其他
  • 参考

简介

bpftrace使用 LLVM 作为后端将脚本编译为 BPF 字节码,利用 BCC(BPF Compiler Collection)与 Linux BPF 系统进行交互。

5种探针

kprobe:跟踪内核函数的入口。
kretprobe:跟踪内核函数的返回。
uprobe:跟踪用户空间函数的入口。
uretprobe:跟踪用户空间函数的返回。
tracepoint:跟踪内核中的 tracepoint。

内置变量:

arg0 到 argN:代表内核或用户空间探针的参数。
retval:代表内核或用户空间探针的返回值。
pid:当前进程的进程 ID。
tid:当前线程的线程 ID。
comm:当前进程的命令名称。
cpu:当前进程所在的 CPU。
nsecs:自系统启动以来的纳秒数。

安装

添加 BPFtools 仓库:

curl https://repos.baslab.org/rhel/7/bpftools/bpftools.repo --output /etc/yum.repos.d/bpftools.repo

安装 bpftrace

sudo yum install bpftrace bpftrace-tools bpftrace-doc bcc-static bcc-tools

实操

内核态:

bpftrace -e 'kprobe:ib_umem_get { printf("ib_umem_get called with args: %d %d\n", arg0, arg1); }'

返回值:

bpftrace -e 'kretprobe:ib_umem_get { printf("ib_umem_get returned %d\n", retval); }'

多个函数

执行:bpftrace test.bt
test.bt内容:

#!/usr/bin/env bpftrace// 跟踪函数 func1,并打印前四个参数
kprobe:func1
{printf("func1 called with args: %d %d %d %d\n", arg0, arg1, arg2, arg3);
}// 跟踪函数 func2,并打印前四个参数
kprobe:func2
{printf("func2 called with args: %d %d %d %d\n", arg0, arg1, arg2, arg3);
}

用户态

bpftrace -e 'uprobe:/path/to/my/exec:test_esec { printf("test_esec started\\n"); }'

so等无法直接访问

if语句

bpftrace -e 'uprobe:/path/to/my/exec:test_esec { if (comm == "exec") {printf("test_esec started\\n"); }}'

查看支持的观测点

bpftrace -l

可以用grep部分头部,进而设置更多观测函数,比如 bpftrace -l | grep :ib_ bpftrace -l | grep mlx5_ib_ 等。

其他

  • 访问参数字符串:printf("%s", str(arg1)); 根据arg1是否是指针可能需要转换
  • 根据参数偏移访问:`printf(“%s”, str(*(arg1+100)));``
  • 根据每种应用写bt脚本,既有app,也有kernel,观测效果不错
  • bt脚本观测解析arg的时候要注意偏移,可以结合crash、gdb等方法。
  • crash中struct的方式 ptype -o struct xxx,gdb中struct的方式 ptype /o struct xxx。详细参考兄弟篇:https://blog.csdn.net/essencelite/article/details/132074198

参考

源码路径:https://github.com/iovisor/bpftrace.git


http://www.ppmy.cn/devtools/37528.html

相关文章

IAP15W4K61S4单片机EEPROM读写程序

/*-------------关闭IAP----------------*/ void IapIdle() { IAP_CONTR 0; //关闭IAP功能 IAP_CMD 0; //清除命令寄存器 IAP_TRIG 0; …

【Redis分布式缓存】分片集群

Redis 分片集群 搭建分片集群 集群结构 分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下: 这里我们会在同一台虚拟机中开启6个redis实例&…

20240507最新 ubuntu20.04安装ros noetic

ubuntu20.04安装ros 主要参考博客 【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程_ubuntu20.04安装ros-CSDN博客 出现问题 1.ubuntu20.04 更换清华源报错 ubuntu20.04 更换清华源报错_gvfs metadata is not supported. fallback to teplme-CSDN博客 ?&#xff1f…

关于RN中Image的style下tintColor使用

React Native中Image组件的style属性下面有个tintColor 文档描述如下: tintColor: color Changes the color of all the non-transparent pixels to the tintColor. 改变不透明像素的颜色 比如一个白色背景页面,黑色icon图标,手机切换到暗黑…

UDP多播

1 、多播的概念 多播,也被称为组播,是一种网络通信模式,其中数据的传输和接收仅在同一组内进行。多播具有以下特点: 多播地址标识一组接口:多播使用特定的多播地址,该地址标识一组接收数据的接口。发送到多…

北京大学-知存科技存算一体联合实验室揭牌,开启知存科技产学研融合战略新升级

5月5日,“北京大学-知存科技存算一体技术联合实验室”在北京大学微纳电子大厦正式揭牌,北京大学集成电路学院院长蔡一茂、北京大学集成电路学院副院长鲁文高及学院相关负责人、知存科技创始人兼CEO王绍迪、知存科技首席科学家郭昕婕博士及企业研发相关负…

Git 仓库基本概念和使用方式

Git 是一种分布式版本控制系统,它用于跟踪和管理软件开发项目中的代码修改。以下是 Git 的基本概念和使用方式。 1. 仓库(Repository):Git 仓库是存储代码的地方,可以是本地仓库(local repository&#xf…

大数据中服役新数据节点和退役旧节点步骤(hive,hadoop)

1- 节点上线操作 当要新上线数据节点的时候 ,需要把数据节点的名字追加在 dfs.hosts (1)关闭新增节点的防火墙 (2)在 NameNode 节点的 hosts 文件中加入新增数据节点的 hostname (3)在每个新…