`
aigo
  • 浏览: 2635798 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

内核探测工具systemtap简介

C 
阅读更多

原文:http://www.cnblogs.com/hazir/p/systemtap_introduction.html

 

systemtap是内核开发者必须要掌握的一个工具,本文我将简单介绍一下此工具,后续将会有系列文章介绍systemtap的用法。

 

什么是systemtap

假如现在有这么一个需求:需要获取正在运行的 Linux 系统的信息,如我想知道系统什么时候发生系统调用,发生的是什么系统调用等这些信息,有什么解决方案呢?

 

最原始的方法是,找到内核系统调用的代码,加上我们需要获得信息的代码、重新编译内核、安装、选择我们新编译的内核重启。这种做法对于内核开发人员简直是梦魇,因为一遍做下来至少得需要1个多小时,不仅破坏了原有内核代码,而且如果换了一个需求又得重新做一遍上面的工作。所以,这种调试内核的方法效率是极其底下的。

之后内核引入了一种Kprobe机制,可以用来动态地收集调试和性能信息的工具,是一种非破坏性的工具,用户可以用它跟踪运行中内核任何函数或执行的指令等。相比之前的做法已经有了质的提高了,但Kprobe并没有提供一种易用的框架,用户需要自己去写模块,然后安装,对用户的要求还是蛮高的。

systemtap 是利用Kprobe 提供的API来实现动态地监控和跟踪运行中的Linux内核的工具,相比Kprobe,systemtap更加简单,提供给用户简单的命令行接口,以及编写内核指令的脚本语言。对于开发人员,systemtap是一款难得的工具。

下面将会介绍systemtap的安装、systemtap的工作原理以及几个简单的示例。

 

systemtap 的安装

我的主机 Linux 发行版是32位 Ubuntu13.04,内核版本 3.8.0-30。由于 systemtap 运行需要内核的调试信息支撑,默认发行版的内核在配置时这些调试开关没有打开,所以安装完systemtap也是无法去探测内核信息的。 下面我以两种方式安装并运行 systemtap:

 

方法一

 

编译内核以支持systemtap 

我们重新编译内核让其支持systemtap,首先你想让内核中有调试信息,编译内核时需要加上 -g 标志;其次,你还需要在配置内核时将 Kprobe 和 debugfs 开关打开。最终效果是,你能在内核 .config 文件中看到下面四个选项是设置的:

 

  CONFIG_DEBUG_INFO

  CONFIG_KPROBES

  CONFIG_DEBUG_FS

  CONFIG_RELAY

配置完之后,按照之前你编译内核的步骤编译即可。

 

获取systemtap源码 

从此地址 https://sourceware.org/systemtap/ftp/releases下载已经发布的systemtap的源代码,截至目前(2013.9.17)最新版本为systemtap-2.3。下载完之后解压。 当然你还可以使用 git 去克隆最新的版本(2.4),命令如下:

 

  git clone git://sources.redhat.com/git/systemtap.git

编译安装systemtap 

如果你下载的是最新版本的systemtap,那么你需要新版的 elfutils,可以从https://fedorahosted.org/releases/e/l/elfutils/ 下载elfutils-0.156 版本。下载之后解压缩到适合的目录(我放在~/Document/ 下),不需要安装,只要配置systemtap时指定其位置即可。 进入之前解压systemtap的目录,使用下面命令进行配置:

 

   ./configure --with-elfutils=~/Document/elfutils-0.156

以这里方法配置之后,你只需要再运行 make install 即完成systemtap的编译安装。如果需要卸载的话,运行 make uninstall。

 

方法二

 

由于发行版的内核默认无内核调试信息,所以我们还需要一个调试内核镜像,在http://ddebs.ubuntu.com/pool/main/l/linux/ 找到你的内核版本相对应的内核调试镜像(版本号包括后面的发布次数、硬件体系等都必须一致),如针对我上面的内核版本,就可以用如下命令下载安装内核调试镜像:

 

$ wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-debug-3.8.0-30-generic_dbgsym_3.8.0-30.43_i386.ddeb

$ sudo dpkg -i linux-image-debug-3.8.0-30-generic_dbgsym_3.8.0-30.43_i386.ddeb

一般这种方法下,你只需要使用apt在线安装systemtap即可:

 

$sudo apt-get install systemtap

当然方法二仅限于Ubuntu发行版,至于其他的发行版并不能照搬,网上也有很多相关的资料。

 

systemtap 测试示例

安装完systemtap之后,我们需要测试一下systemtap是否能正确运行:

 

示例一:打印hello systemtap

 

以root用户或者具有sudo权限的用户运行以下命令:

 

$stap -ve 'probe begin { log("hello systemtap!") exit() }'

如果安装正确,会得到如下类似的输出结果:

 

Pass 1: parsed user script and 96 library script(s) using 55100virt/26224res/2076shr/25172data kb, in 120usr/0sys/119real ms.

Pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 55496virt/27016res/2172shr/25568data kb, in 0usr/0sys/4real ms.

Pass 3: translated to C into "/tmp/stapYqNuF9/stap_e2d1c1c9962c809ee9477018c642b661_939_src.c" using 55624virt/27380res/2488shr/25696data kb, in 0usr/0sys/0real ms.

Pass 4: compiled C into "stap_e2d1c1c9962c809ee9477018c642b661_939.ko" in 1230usr/160sys/1600real ms.

Pass 5: starting run.

hello systemtap!

Pass 5: run completed in 0usr/10sys/332real ms.

示例二:打印4s内所有open系统调用的信息

 

创建systemtap脚本文件test2.stp:

 

#!/usr/bin/stap

 

probe begin 

{

    log("begin to probe")

}

 

probe syscall.open

{

    printf ("%s(%d) open (%s)\n", execname(), pid(), argstr)

}

 

probe timer.ms(4000) # after 4 seconds

{

    exit ()

}

 

probe end

{

    log("end to probe")

}

将该脚本添加可执行的权限 chmod +x test2.stp ,使用./test2.stp 运行该脚本,即可打印4s内所有open系统调用的信息,打印格式为:进程名(进程号)打开什么文件。 大家可以自行去测试,如果两个示例都能正确运行,基本上算是安装成功了!

 

systemtap 工作原理

systemtap 的核心思想是定义一个事件(event),以及给出处理该事件的句柄(Handler)。当一个特定的事件发生时,内核运行该处理句柄,就像快速调用一个子函数一样,处理完之后恢复到内核原始状态。这里有两个概念:

 

事件(Event):systemtap 定义了很多种事件,例如进入或退出某个内核函数、定时器时间到、整个systemtap会话启动或退出等等。

句柄(Handler):就是一些脚本语句,描述了当事件发生时要完成的工作,通常是从事件的上下文提取数据,将它们存入内部变量中,或者打印出来。

Systemtap 工作原理是通过将脚本语句翻译成C语句,编译成内核模块。模块加载之后,将所有探测的事件以钩子的方式挂到内核上,当任何处理器上的某个事件发生时,相应钩子上句柄就会被执行。最后,当systemtap会话结束之后,钩子从内核上取下,移除模块。整个过程用一个命令 stap 就可以完成。 上面只是简单的原理,更多背后的机理参考网上资料和相应的论文。



 

图 systemtap 处理流程

 

更多参考

systemtap 官网给出了自学教程及相关论文,选择看这个已经足够了:https://sourceware.org/systemtap/documentation.html

IBM 编写的systemtap 指南也是很不错的: http://www.redbooks.ibm.com/abstracts/redp4469.html

  • 大小: 117.2 KB
分享到:
评论

相关推荐

    用systemtap研究内核

    Systemtap 是一个强大的工具,专为Linux内核的动态分析和追踪而设计。它基于kprobes技术,允许用户在不编写C代码或编译内核模块的情况下,使用一种简单的脚本语言对内核行为进行观察和调试。kprobes是Linux内核中的...

    SystemTap_Beginners_Guide.pdf

    SystemTap是Linux内核的一个诊断和监控工具,它允许管理员和开发者通过编译内核模块来快速的诊断问题。SystemTap的最新版本为4.2,它是Red Hat公司贡献的一个项目,通过它可以直接访问内核运行时数据结构和运行时的...

    systemtap tutorial

    SystemTap是一款强大的性能分析和调试工具,它允许开发者和系统管理员通过编写简单的脚本来深入检查活动的Linux系统。SystemTap的工作原理是通过命名事件并在事件发生时给予它们处理器(handlers)。一旦定义的事件...

    使用 SystemTap 调试内核

    SystemTap 的工作原理基于内核中的 kprobe 技术,这是一种动态探测机制,可以在内核函数调用时触发预定义的脚本。SystemTap 提供了一种简单的命令行接口和一套强大的脚本语言,用户可以利用这些脚本对内核行为进行...

    systemTap英文文档集合.7z

    systemTap是一款强大的Linux系统诊断工具,它允许用户以脚本方式收集、分析系统运行时的信息,主要用于解决性能问题和功能故障。这个压缩包文件“systemTap英文文档集合.7z”包含了多份关于systemTap的重要参考资料...

    linux内核分析.pdf

    * SystemTap:一个系统跟踪和探测工具,用于跟踪和探测Linux内核。 * ftrace:一个函数跟踪工具,用于跟踪Linux内核中的函数调用。 Linux内核优化技术: Linux内核优化技术是提高Linux内核性能和效率的技术,包括...

    systemtap使用日记

    SystemTap 是一款非常强大的 Linux 动态跟踪工具,它可以在不需要重新编译内核或者用户程序的情况下收集系统运行时的信息。SystemTap 的灵活性使其成为诊断复杂性能问题的理想工具之一。本文档将详细介绍 SystemTap ...

    嵌入式Linux内核调试和开发工具

    - **SystemTap**:是一种脚本语言,用于在运行时动态探测和分析Linux内核和应用程序的行为。 4. **性能分析工具:** - **perf**:内置于Linux内核的性能事件采样工具,用于分析CPU周期、内存访问、分支预测等性能...

    基于SystemTap的Linux服务器性能分析系统的设计与实现.pdf

    SystemTap是Linux环境下的一款动态追踪工具,它允许开发者在不修改内核的情况下,收集和分析系统运行时的数据,从而进行性能优化和故障排查。该工具提供了高级语言接口,使得编写探测脚本更为便捷,能够深入洞察系统...

    Linux软件性能分析与优化.pdf

    本文主要探讨如何使用Linux内核动态探测工具SystemTap进行性能分析,并通过可视化工具进行结果展示,从而实现对Linux软件性能的有效优化。 SystemTap是一种强大的工具,它允许开发者无需修改内核源代码就能实时监控...

    Linux系统内核调试的研究.pdf

    它可以帮助开发者编写探测点(probe)来跟踪内核事件,而无需修改内核源码。 5. ** printk**:内核中的打印函数,用于在内核日志中输出信息,是调试内核时常用的一种简单方法。 6. **perf**:Linux的性能分析工具...

    systemtap

    - **动态探测点(Probes)**:Systemtap 使用探测点来插入到内核代码或用户空间程序中,这些点会在特定事件发生时触发脚本执行。 - **编译和执行**:Systemtap 脚本会被转换成内核模块,然后在运行时加载到系统中...

    行业文档-设计装置-一种linux内核启动时数据跟踪的方法.zip

    4. **内核 tracing**:内核tracing系统,如ftrace或SystemTap,允许开发者在特定事件发生时记录信息,包括内核函数调用、定时器事件等。 5. **性能分析工具**:如perf,可以收集CPU周期、分支预测错误等硬件事件,...

    Ftrace Kernel Hooks-More than just tracing.pdf

    9. SystemTap:SystemTap 是 Linux 内核中的一个探测机制,能够动态地探测内核中的函数调用过程。它可以与 Ftrace 集成,提供更加强大的问题诊断和性能优化能力。 Ftrace 是一个功能强大的内核钩子机制,能够帮助...

    Systetap Instrumenting the Linux Kernel

    ### SystemTap:Linux内核的仪器化 #### 1.1 SystemTap 是什么? SystemTap 是一种用于在运行中的 Linux 系统上收集诊断数据的工具。它可以在不修改源代码的情况下对内核和应用程序进行非侵入性的探查...

    lkdtm.rar_crash

    5. **内核调试技术**:除了Kprobe,lkdtm可能还利用其他内核调试工具,如kdb(Kernel Debugger)或Systemtap,来辅助测试和分析。 6. **安全性和稳定性**:在测试过程中,lkdtm必须确保不会对系统造成永久性损害,...

Global site tag (gtag.js) - Google Analytics