Heng30的博客
搜索 分类 关于 订阅

如何使用systemtap跟踪调试内核?

2025-02-17

SystemTap是一种用于Linux系统的动态追踪工具,允许用户监控和分析内核及用户空间程序的运行情况。它通过编写脚本插入探针,实时收集数据,帮助诊断性能问题、调试代码和理解系统行为。

主要特点

  • 动态追踪:无需重启系统或重新编译内核,即可实时插入探针。

  • 脚本语言:使用类似AWK的脚本语言,灵活定义追踪逻辑。

  • 内核与用户空间支持:可同时监控内核和用户空间程序。

  • 低开销:设计高效,对系统性能影响小。

核心组件

  • stap:主命令行工具,用于编译和运行脚本。

  • staprun:加载和执行编译后的模块。

  • stap-server:支持远程执行SystemTap脚本。

使用步骤

  • 安装:通过包管理器安装SystemTap和相关内核调试符号。

    sudo apt install -y systemtap-runtime systemtap linux-headers-$(uname -r)
    
  • 编写脚本:使用SystemTap脚本语言定义追踪逻辑。

  • 运行脚本:使用stap命令执行脚本,结果可输出到终端或文件。

例子

# 统计丢弃的数据包数量

#!/usr/bin/env stap

global locations

probe begin { printf("Monitoring for dropped packets\n") }
probe end { printf("Stopping dropped packet monitor\n") }

probe kernel.trace("kfree_skb") { locations[$location] <<< 1 }

probe timer.sec(5)
{
    printf("\n")

    foreach(l in locations-) {
        printf("%d packets dropped at %s\n", @count(locations[l]), symname(l))
    }

    delete locations
}

  • 运行sudo stap --all-modules stap-demo.stp

希望上面的内容对你有所帮助。