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 命令行参数详细介绍。

云从科技AI开放平台
云从科技AI开放平台

云从AI开放平台

下载
  1. 脚本语言

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

  1. 附录

SystemTap 官网教程文档

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

338

2023.10.31

php数据类型
php数据类型

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

225

2025.10.31

c语言 数据类型
c语言 数据类型

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

138

2026.02.12

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

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

95

2025.09.18

python 全局变量
python 全局变量

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

106

2025.09.18

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

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

760

2023.08.03

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

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

221

2023.09.04

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

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

1567

2023.10.24

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.6万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

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

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