按照SystemTap Beginners Guide的Installation and Setup部分安装了SystemTap,没想到竟然还有点曲折,在这里纪录一下。

环境

  • Linux发行版本:CentOS Linux release 7.4.1708 (Core)
  • 内核版本:3.10.0-693.2.2.el7.x86_64
  • uname -a: Linux hostname 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

安装

安装SystemTap

先安装如下两个RPM包:

  • systemtap
  • systemtap-runtime

以root运行如下命令:

# yum install systemtap systemtap-runtime

在运行SystemTap之间,还需要装必要的内核信息包。在现代系统上,可以运行如下stap-prep来安装这些包,如下:

# stap-prep
Need to install the following packages:
kernel-devel-3.10.-693.2..el7.x86_64
kernel-debuginfo-3.10.-693.2..el7.x86_64
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
No package kernel-devel-3.10.-693.2..el7.x86_64 available.
No package kernel-debuginfo-3.10.-693.2..el7.x86_64 available.
Error: Nothing to do
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Could not find debuginfo for main pkg: kernel-3.10.-693.2..el7.x86_64
No debuginfo packages available to install
package kernel-devel-3.10.-693.2..el7.x86_64 is not installed
package kernel-debuginfo-3.10.-693.2..el7.x86_64 is not installed
problem installing rpm(s) kernel-devel-3.10.-693.2..el7.x86_64 kernel-debuginfo-3.10.-693.2..el7.x86_64

运行stap-prep的时候,它探测出还要安装kernel-devel-3.10.0-693.2.2.el7.x86_64包和kernel-debuginfo-3.10.0-693.2.2.el7.x86_64包 (实际上还有kernel-debuginfo-common包),但是自动安装失败。我们可以按照如下方法手动安装。

手动安装必要的内核信息包

SystemTap需要安装内核内核符号文件来probe内核。必要的内核信息包含在如下三个包中:

  • kernel-debuginfo
  • kernel-debuginfo-common
  • kernel-devel

一定要安装与当前内核版本一致的包。当前环境的内核版本是3.10.0-693.2.2.el7.x86_64,所以需要安装的包为:

  • kernel-debuginfo-3.10.0-693.2.2.el7.x86_64
  • kernel-debuginfo-common-3.10.0-693.2.2.el7.x86_64
  • kernel-devel-3.10.0-693.2.2.el7.x86_64

注意:其实在上一步运行stap-prep时,已经把需要的包的名称及其内核精准地打印在屏幕上了。

接下来安装这三个包,注意不要直接yum install kernel-debuginfo kernel-debuginfo-common kernel-devel, 即使能找到相应的包,也是安装的最新版本,不会自动匹配当前版本。所以我们下载RPM包,再用rpm命令依次安装。

对于CentOS来说,内核符号文件一版在http://debuginfo.centos.org上有各个版本非常完整的包,但是一般从境内下载都比较慢,特别是kernel-debuginfo,比较大下载可能非常慢。所以在debuginfo.centos.org上下了kernel-debuginfo-common包,另外两个包在Google上搜了一把,分别找了两个镜像。下了之后才发现这个地方有坑,这个坑在后面展开讲。

wget https://ftp.sjtu.edu.cn/scientific/7/archive/debuginfo/kernel-debuginfo-3.10.0-693.2.2.el7.x86_64.rpm
wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-693.2.2.el7.x86_64.rpm
wget ftp://mirror.switch.ch/pool/4/mirror/scientificlinux/7.0/x86_64/updates/security/kernel-devel-3.10.0-693.2.2.el7.x86_64.rpm

下载之后,直接用rpm命令安装就好:

# rpm -ivh kernel-debuginfo-common-x86_64-3.10.-693.2..el7.x86_64.rpm
# rpm -ivh kernel-debuginfo-3.10.-693.2..el7.x86_64.rpm
# rpm -ivh kernel-devel-3.10.-693.2..el7.x86_64.rpm

至此安装步骤完毕,下面来测试SystemTap能不能正常运行。

运行SystemTap

为了测试stap是否能正常运行,用如下简单命令打印:

# stap -e 'probe begin{printf("Hello, World"); exit();}'

运行失败...结果如下:

# stap -e 'probe begin{printf("Hello, World"); exit();}'
ERROR: module version mismatch (# SMP Tue Sep :: CDT vs # SMP Tue Sep :: UTC ), release 3.10.-693.2..el7.x86_64
WARNING: /usr/bin/staprun exited with status:
Pass : run failed. [man error::pass5]

错误信息是:"ERROR: module version mismatch (#1 SMP Tue Sep 1210:10:26 CDT 2017 vs #1 SMP Tue Sep 1222:26:13 UTC 2017)"。

解决"ERROR: module version mismatch"问题

stap运行的时候加上-v参数,打印更多信息看看还有没有更多线索:

# stap -e 'probe begin{printf("Hello, World"); exit();}' -v
Pass : parsed user script and library scripts using 228224virt/41280res/3348shr/38020data kb, in 330usr/20sys/346real ms.
Pass : analyzed script: probe, function, embeds, globals using 229148virt/42332res/3536shr/38944data kb, in 0usr/0sys/6real ms.
Pass : using cached /root/.systemtap/cache/0b/stap_0bc9e27aef7a1de50ea41889a27fc524_1010.c
Pass : using cached /root/.systemtap/cache/0b/stap_0bc9e27aef7a1de50ea41889a27fc524_1010.ko
Pass : starting run.
ERROR: module version mismatch (# SMP Tue Sep :: CDT vs # SMP Tue Sep :: UTC ), release 3.10.-693.2..el7.x86_64
WARNING: /usr/bin/staprun exited with status:
Pass : run completed in 0usr/10sys/38real ms.
Pass : run failed. [man error::pass5]

查看c文件,vi /root/.systemtap/cache/0b/stap_0bc9e27aef7a1de50ea41889a27fc524_1010.c,搜错误信息"module version mismatch",能搜到报错发生在下面的第13行,至于UTS_RELEASE和UTS_VERSION是在哪里设置的,直接Google一把。

 #ifndef STP_NO_VERREL_CHECK
const char* release = UTS_RELEASE;
#ifdef STAPCONF_GENERATED_COMPILE
const char* version = UTS_VERSION;
#endif
might_sleep();
if (strcmp (release, "3.10.0-693.2.2.el7.x86_64")) {
_stp_error ("module release mismatch (%s vs %s)", release, "3.10.0-693.2.2.el7.x86_64");
rc = -EINVAL;
}
#ifdef STAPCONF_GENERATED_COMPILE
if (strcmp (utsname()->version, version)) {
_stp_error ("module version mismatch (%s vs %s), release %s", version, utsname()->version, release);
rc = -EINVAL;
}
#endif
#endif

有两篇文章里面提到了同样的坑,文章连接在底部的参考中。在kernel-devel包的所以文件中搜以下变量UTS_VERSION,

# rpm -ql kernel-devel | xargs grep UTS_VERSION
/usr/src/kernels/3.10.-693.2..el7.x86_64/include/generated/compile.h:#define UTS_VERSION "#1 SMP Tue Sep 12 10:10:26 CDT 2017"

可以看到在compile.h中有#define UTS_VERSION "#1 SMP Tue Sep 12 10:10:26 CDT 2017". 这个是不是很熟悉... 对比下上面运行stap的报错信息, module mismatch的时间就是这个。文件compile.h是自动生成的,可能和当时编译时的时间相关。但是stap要求这个也和当前系统uname -a里面的时间完全一直,如果下个CentOS原生的kernel-devel应该就没这个问题。

解决问题的另一个简单方法就是直接修改这个compile.h文件,原来的文件如下:

# cat /usr/src/kernels/3.10.-693.2..el7.x86_64/include/generated/compile.h
/* This file is auto generated, version 1 */
/* SMP */
#define UTS_MACHINE "x86_64"
#define UTS_VERSION "#1 SMP Tue Sep 12 10:10:26 CDT 2017"
#define LINUX_COMPILE_BY "mockbuild"
#define LINUX_COMPILE_HOST "sl7-uefisign.fnal.gov"
#define LINUX_COMPILER "gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) "

修改define UTS_VERSION那一行,如下:

#define UTS_VERSION "#1 SMP Tue Sep 12 10:10:26 CDT 2017" -> #define UTS_VERSION "#1 SMP Tue Sep 12 22:26:13 UTC 2017"

再次运行stap:

# stap -e 'probe begin{printf("Hello, World"); exit();}' -v
Pass : parsed user script and library scripts using 228220virt/41276res/3348shr/38016data kb, in 350usr/10sys/355real ms.
Pass : analyzed script: probe, function, embeds, globals using 229144virt/42328res/3536shr/38940data kb, in 0usr/0sys/6real ms.
Pass 3: using cached /root/.systemtap/cache/0b/stap_0bc9e27aef7a1de50ea41889a27fc524_1010.c
Pass 4: using cached /root/.systemtap/cache/0b/stap_0bc9e27aef7a1de50ea41889a27fc524_1010.ko
Pass : starting run.
ERROR: module version mismatch (# SMP Tue Sep :: CDT vs # SMP Tue Sep :: UTC ), release 3.10.-693.2..el7.x86_64
WARNING: /usr/bin/staprun exited with status:
Pass : run completed in 0usr/10sys/38real ms.
Pass : run failed. [man error::pass5]

因为中间生成的C文件和ko模块都是用的cache (蓝色标注的部分),我们把上面的cache文件删除,再重新运行,这次可以成功了。

# stap -e 'probe begin{printf("Hello, World"); exit();}'
Hello, World

参考

https://sourceware.org/systemtap/SystemTap_Beginners_Guide/using-systemtap.html#using-setup

ERROR: module version mismatch

https://groups.google.com/forum/#!topic/openresty/nlEc3qlDyOc

SystemTap - 安装的更多相关文章

  1. RHEL6 Systemtap 安装笔记

    以 RHEL6u3 为例 1  Systemtap 安装 yum install systemtap 跟systemtap有关的有6,7个,全装上,别偷懒 就用yum安装,别傻傻的去下rpm包,吃力不 ...

  2. systemtap安装

    一.systemtap介绍 SystemTap是一个强大的调试工具,是监控和跟踪运行中的Linux 内核的操作的动态方法,确切的说应该是一门调试语言,因为它有自己的语法,也有解析.编译.运行等过程(准 ...

  3. systemtap 安装试用

    1. 安装 yum install -y systemtap systemtap-runtime 2. 环境准备    a. 自动安装依赖 stap-prep b. 手动安装依赖 kernel-deb ...

  4. systemtap 安装 总结

    http://blog.soul11201.com/notes/2017/02/22/systemstap-install.html

  5. 【SystemTap】 Linux下安装使用SystemTap源码安装SystemTap

    转自 http://blog.csdn.net/zklth/article/details/6248558 文章 http://blog.csdn.net/zklth/archive/2010/09/ ...

  6. CentOS 5.4 final下Systemtap的安装

    CentOS 5.4 final下Systemtap的安装  时间:2015-02-11来源:linux网站 作者:zklth  一.Systemtap运行环境需求   (1)linux kernel ...

  7. 转 -Linux 自检和 SystemTap (强大的内核调试工具)---包含下载地址

    下载: http://www.oschina.net/p/systemtap/ https://sourceware.org/systemtap/ftp/releases/   Linux 自检和 S ...

  8. Linux 下的一个全新的性能测量和调式诊断工具 Systemtap, 第 3 部分: Systemtap

    Systemtap的原理,Systemtap与DTrace比较,以及安装要求和安装步骤本系列文章详细地介绍了一个Linux下的全新的调式.诊断和性能测量工具Systemtap和它所依赖的基础kprob ...

  9. Linux systemtap定位系统IO资源使用情况(ok)

    一.systemtap介绍 SystemTap是一个强大的调试工具,是监控和跟踪运行中的Linux 内核的操作的动态方法,确切的说应该是一门调试语言,因为它有自己的语法,也有解析.编译.运行等过程(准 ...

随机推荐

  1. Debian 无线网卡驱动问题

    参考这里:https://wiki.debian.org/iwlwifi Debian 9 "Stretch" Add a "non-free" compone ...

  2. List Control控件

    List Control控件 显示方式 属性[View]选择成[Report]. 添加成员变量 绑定变量:m_listCtrl 设置值 // 表头添加 m_listCtrl.SetExtendedSt ...

  3. input 子系统架构总结【转】

    Linux输入子系统(Input Subsystem) 转自:http://blog.csdn.net/lbmygf/article/details/7360084 Linux 的输入子系统不仅支持鼠 ...

  4. 巧用CASE WHEN 验证用户登录信息

    最近逛博客园的时候偶然看到一个很巧妙的SQL,巧妙利用CASE WHEN 实现一个简单的 SQL 同时验证用户帐号是否存在.密码是否正确.晓菜鸟之前的做法都是根据用户名和密码一起验证,如果验证失败直接 ...

  5. 配置Sublime Text2的python运行环境(Sublime Text 3也类似)

    1. 前言 用Sublime Text 2 配置Python运用环境,有简单配置还有像IDLE一样的配置,本文分成第一部分和第二部分.   2. 配置 第一部分(简单配置)   1.只需要打开Pref ...

  6. Python-CSS入门

    一.架构分析 页面 => div的层级结构 => 具有采用哪些功能标签显示内容 结构层 > 位置层(布局层) > 内容层 二.css引入 - 行间式 <!-- 简单直接, ...

  7. VM 安装 linux Enterprise_R5_U4_Server_I386_DVD教程图解

    ocp 学习笔记 20161126--------linux 笔记整理 一:安装linux系统环境: 1:linux 系统安装包下载路径:链接:链接: https://pan.baidu.com/s/ ...

  8. Socket 实现聊天功能

    注:本文来自:简书:jianshu 作者:jijs链接:http://www.jianshu.com/p/7c0722a8b66f來源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  9. LeetCode(43):字符串相乘

    Medium! 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = &quo ...

  10. pytest十三:配置文件 pytest.ini

    pytest 配置文件可以改变 pytest 的运行方式,它是一个固定的文件 pytest.ini 文件,读取配置信息,按指定的方式去运行. ini 配置文件pytest 里面有些文件是非 test ...