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

2024-05-08 11:04

本文主要是介绍Linux动态观测神器bpftrace的5种探针、7个常见内置变量和常见操作?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 简介
  • 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

这篇关于Linux动态观测神器bpftrace的5种探针、7个常见内置变量和常见操作?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970127

相关文章

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详