0

0

SystemTap

看不見的法師

看不見的法師

发布时间:2025-07-15 08:40:21

|

601人浏览过

|

来源于php中文网

原创

  1. SystemTap 简介

systemtap 是一款用于诊断 linux 系统性能或功能问题的开源工具。它使得对运行中的 linux 系统进行诊断和调试变得更加便捷和高效。有了 systemtap,开发者和调试人员无需重新编译内核、安装新内核或重启系统等繁琐步骤。为了解决系统问题或提升性能,开发者只需编写一些脚本即可。systemtap 本身提供了一系列名为「tapset」的预定义脚本,开发者可以通过 systemtap 的命令行接口对正在运行的内核进行诊断和调试,从而避免了修改或插入调试代码、重新编译内核、安装内核和重启系统等繁琐工作。

  1. 原理

SystemTap 使用了一种类似于 awk 和 C 语言的脚本语言(类似于 Dtrace 的 D 语言)。它仅使用三种数据类型:整数(integers)、字符串(strings)以及关联数组(associative Arrays)。SystemTap 提供了完整的控制结构,包括块(blocks)、条件(conditionals)、循环(loops)和函数(functions)。语句分割符 ; 是可选的。变量无需声明类型,它们会根据上下文自动推测和检查。SystemTap 使用 kprobe 提供的接口来实现探测。对于每个探测点,需要定义探测点和相应的处理函数。探测点指的是 kprobe 中被探测的函数或指令地址(也称为内核事件),但在 SystemTap 中,用户可以指定源文件、源代码的某一行或一个异步事件,如周期性定时器。探测点使用层次化的命名方式,探测点处理函数可以立即输出数据,类似于 printk,并能查看内核数据。脚本随后被转换为 C 代码,并编译成内核模块。探测点根据内核的 DWARF 调试信息映射到内核的虚地址(因此 SystemTap 要求用户必须准备好可用的内核调试信息)。所有脚本内容在转换时进行严格检查,运行时也会进行检查(如无限循环、内存使用、递归和无效指针等),因此具有良好的安全性,不会影响正在运行的系统(这对于生产系统非常重要)。SystemTap 包含了一个黑名单,列出了不能被 SystemTap 探测的函数,因为它们可能导致无限探测循环、锁重入等问题。SystemTap 脚本文件的后缀是 .stp,使用 SystemTap 定义的脚本语言。一个 SystemTap 脚本描述了要探测的探测点,并定义了相关处理函数,每个探测点对应于一个内核函数、事件或函数内部的某个位置。关联的处理函数将在内核执行到相应探测点时被执行。tapsets 是一个脚本库,包含许多 tapset,每个 tapset 通常为某一内核子系统或特定功能块预定义了一套探测点、辅助函数或全局变量,供用户脚本或其他 tapset 引用。它们定义的一些数据可以被每个探测点处理函数或脚本使用,这些数据通常通过使用处理函数语句块(HSB Handler Statement Block)来导出,HSB 语句块中的变量就是被导出的数据。tapset 通常由该内核子系统的开发者或对子系统非常了解的开发者编写,使用脚本语言和 C 语言,并且已经经过测试和验证,可以安全使用。tapsets 是 SystemTap 发行包的一部分。SystemTap 实现了一个脚本转换器/翻译器,当用户执行一个 SystemTap 脚本时,SystemTap 首先对其进行分析和一些安全检查。如果脚本引用了 SystemTap 预定义的脚本库提供的函数,SystemTap 也将读取脚本库获取相应代码。对于一些内核变量或符号的引用,必须根据内核调试信息解析到相应地址。然后,脚本被转换为 C 代码,在此转换中,SystemTap 将根据需要添加必要的锁和安全检查代码。探测点之间共享的变量将被转换为适当的静态声明并有锁保护,每组本地变量被转换到一个合成的调用帧结构中,以避免消耗内核的栈空间。关联到探测点的处理函数被封装成一个接口函数,该函数调用适当的 kprobe 接口函数来注册该探测点。生成的 C 代码包含了一些对运行时 tapset 的引用,运行时 tapset 库提供了许多 SystemTap 接口函数,如通用查询表、受限内存管理、启动、关闭、I/O 操作以及其他一些函数。生成的 C 代码编译链接后生成一个可加载的内核模块。为了快速获得运行结果,SystemTap 使用了 relayfs。加载生成的内核模块后,该模块的初始化函数初始化自身,然后调用 kprobe 接口函数注册脚本中定义的探测点。当内核运行到注册的探测点时,相应的处理函数被调用,用户在处理函数中的输出语句将调用 relayfs 接口函数输出结果数据,用户在处理函数中也可以调用一些内核的性能测量函数。当用户主动停止或脚本设定的条件满足时,模块将调用退出函数卸载已经注册的探测点并进行一些清理处理,然后卸载模块自身。SystemTap 在运行时启动了一个进程,专门负责通过 relayfs 读取模块的输出数据并即时输出给用户。

SystemTap

  1. Stap 命令详细参考

Stap 命令行参数详细介绍。

Magic Eraser
Magic Eraser

AI移除图片中不想要的物体

下载
  1. 脚本语言

SystemTap 中有两个重要的概念:事件(event)和处理函数(handler)。在 SystemTap 执行一个脚本时,它会监控事件(event)。当事件发生时,Linux 内核就会执行处理函数(handler)。事件的类型包括开始/结束、定时器超时、会话终止等。处理函数就是在指定事件发生时需要执行的一些脚本语句。

  1. 附录

SystemTap 官网教程文档

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

303

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

78

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

209

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

620

2023.11.24

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 5.6万人学习

Rust 教程
Rust 教程

共28课时 | 4.6万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号