当前位置: 首页 > news >正文

【Linux 系统调试】系统的动态跟踪工具--SystemTap

目录

一、SystemTap工具介绍

二、安装SystemTap

三、SystemTap工具作用与使用方法

1. SystemTap作用

2. 使用方法

2.1 编写SystemTap脚本

2.2 运行脚本

四、应用场景介绍

1. 实例场景:监控系统调用

2. 实例场景:监控内核函数调用

3. 实例场景:监控网络数据包

五、总结


一、SystemTap工具介绍

        SystemTap是一种用于Linux系统的动态跟踪工具,允许用户监控和调试运行中的内核和用户空间程序。它通过编写脚本(称为“探针”)来收集系统信息,帮助分析性能问题、调试内核模块或用户程序。

二、安装SystemTap

        在大多数Linux发行版中,可以通过包管理器安装SystemTap。例如,在基于Debian的系统上:

sudo apt-get install systemtap

        在基于RPM的系统上:

sudo yum install systemtap

        安装完成后,确保内核调试符号包已安装,以便SystemTap能够访问内核符号:

sudo apt-get install linux-image-$(uname -r)-dbgsym

三、SystemTap工具作用与使用方法

        通过SystemTap脚本,可以深入分析Linux系统的运行状态,帮助开发者和系统管理员快速定位和解决问题

1. SystemTap作用

  • 监控特定内核函数的调用频率。
  • 分析系统调用对性能的影响。
  • 调试内核模块或驱动程序的行为。

2. 使用方法

2.1 编写SystemTap脚本

        编写SystemTap脚本 SystemTap脚本通常以.stp为扩展名,是一种用于Linux系统性能分析和故障排查的强大工具。脚本的基本结构包括探针定义和探针触发时执行的操作。下面是一个完整的SystemTap脚本示例及其详细说明:

# 定义脚本的元信息
# 脚本名称:example.stp
# 功能描述:演示SystemTap脚本的基本结构
# 作者:好多鱼
# 版本:1.0# 定义全局变量(可选)
global count = 0# 定义探针:脚本开始时触发
probe begin {# 打印脚本启动信息printf("SystemTap script started at %s\n", ctime(gettimeofday_s()))
}# 定义探针:内核函数调用时触发
probe kernel.function("sys_open") {# 每次触发时增加计数器count++# 打印函数调用信息printf("sys_open called by process %s (PID: %d)\n", execname(), pid())
}# 定义探针:脚本结束时触发
probe end {# 打印脚本结束信息和统计结果printf("SystemTap script ended at %s\n", ctime(gettimeofday_s()))printf("Total sys_open calls: %d\n", count)
}

脚本说明:

  1. 元信息:脚本开头可以添加注释,描述脚本的名称、功能、作者和版本等信息,便于维护和理解。
  2. 全局变量global关键字用于定义全局变量,可以在多个探针中共享和修改。
  3. 探针定义
    • probe begin:脚本启动时触发,通常用于初始化操作或打印启动信息。
    • probe kernel.function("sys_open"):监控内核函数sys_open的调用,每次调用时触发。
    • probe end:脚本结束时触发,通常用于清理操作或打印统计信息。
  4. 函数和变量
    • ctime(gettimeofday_s()):获取当前时间并格式化为可读字符串。
    • execname():获取当前进程的名称。
    • pid():获取当前进程的PID。

2.2 运行脚本

  1. 将脚本保存为example.stp
  2. 使用以下命令运行脚本:
    sudo stap example.stp
    
  3. 脚本运行期间会实时打印sys_open函数的调用信息,并在结束时输出总调用次数。

四、应用场景介绍

1. 实例场景:监控系统调用

  • 编写脚本

 假设需要监控open系统调用的使用情况,可以编写如下脚本:

probe syscall.open {printf("Process %s (PID %d) opened file: %s\n", execname(), pid(), filename)
}
  •  运行SystemTap脚本

将上述脚本保存为open_syscall.stp,然后使用以下命令运行:

sudo stap open_syscall.stp
  • 输出结果示例

当有进程调用open系统调用时,输出可能如下:

Process bash (PID 1234) opened file: /etc/passwd
Process vim (PID 5678) opened file: /home/user/.vimrc

2. 实例场景:监控内核函数调用

假设需要监控vfs_read内核函数的调用情况,可以编写如下脚本:

probe kernel.function("vfs_read") {printf("vfs_read called by process %s (PID %d)\n", execname(), pid())
}
  • 运行SystemTap脚本

将上述脚本保存为vfs_read.stp,然后使用以下命令运行:

sudo stap vfs_read.stp
  • 输出结果示例

当有进程调用vfs_read函数时,输出可能如下:

vfs_read called by process cat (PID 1234)
vfs_read called by process less (PID 5678)

3. 实例场景:监控网络数据包

假设需要监控网络接口eth0上的数据包,可以编写如下脚本:

probe netdev.receive {if (devname == "eth0") {printf("Received packet on eth0: %d bytes\n", length)}
}
  • 运行SystemTap脚本

将上述脚本保存为net_traffic.stp,然后使用以下命令运行:

sudo stap net_traffic.stp
  • 输出结果示例

当有数据包到达eth0接口时,输出可能如下:

Received packet on eth0: 64 bytes
Received packet on eth0: 128 bytes

五、总结

        SystemTap是一个功能强大的工具,能够帮助用户深入分析Linux系统的运行情况。通过编写简单的脚本,可以监控系统调用、内核函数、网络数据包等,从而快速定位和解决系统性能问题。

相关文章:

  • 系统平衡与企业挑战
  • C++ 字符格式化输出
  • Linux 系统安全基线检查:入侵防范测试标准与漏洞修复方法
  • 【递归、搜索与回溯】专题一:递归(二)
  • SparkSQL 连接 MySQL 并添加新数据:实战指南
  • 微服务八股(自用)
  • hashicorp vault机密管理系统的国产化替代:安当SMS凭据管理系统,量子安全赋能企业密钥管理
  • 软考软件测评师——计算机网络
  • 【Pandas】pandas DataFrame cummin
  • NC报销单保存时,报”保存失败:fail to save VO Array ~#@“
  • SQL中联表的运用
  • EXCEL下拉菜单与交替上色设置
  • ElasticSeach快速上手笔记-入门篇
  • 为什么 import _ “github.com/go-sql-driver/mysql“ 要导入但不使用?_ 是什么意思?
  • 中电金信参编的国家标准《信息技术 中间件 消息中间件技术要求》正式发布
  • 1.3 不确定性分析
  • 云蝠智能大模型呼叫优势:技术驱动全链路升级,重塑智能交互服务新体验
  • 【JavaScript】原生 JavaScript 实现 localStorage 过期时间
  • ubuntu----100,常用命令2
  • 裸机开发的核心技术:轮询、中断与DMA
  • 最新研究:新型合成小分子可“精准杀伤”癌细胞
  • “救护车”半路加价?陕西卫健委已介入,记者调查:黑救护车挤占市场
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 泽连斯基批准美乌矿产协议
  • 《淮水竹亭》:一手好牌,为何打成这样
  • 举牌代跳明码标价、留言不堪入目,未成年人擦边短视频成引流利器