当运行SystemTap脚本时,会根据脚本生成一个内核模块,然后插入到系统中执行后退出。这个过程总共分为5个阶段:parse, elaborate, translate, compile, run,对应的编号为1-5.stap命令的-p选项可以用来指定在哪个阶段停止,利用这个选项可以将脚本编译成内核模块。
正常情况下,SystemTap脚本只能在部署了SystemTap执行环境(安装内核的开发包和debuginfo包)的机器,如果要在十台机器上执行,就要在这些机器上都部署这样的环境。如果将脚本编译成内核模块,借助staprun命令(需要systemtap-runtime包)就可以像直接使用stap命令执行脚本一样。当然,也可以直接使用insmod或modprobe命令直接将内核模块插入到系统中运行。除此之外,还可以利用生成的内核模块来修改系统的一些行为,具体可以参考褚霸的文章《Systemtap辅助设置tcp_init_cwnd,免对操作系统打Patch》。
下面介绍一下具体的步骤:
1、编写脚本
示例脚本如下:

probe begin {

%{ printk(KERN_ALERT
"Hello, World!\n")
%};

exit();

}

在上面的脚本中嵌入了C代码,将“hello World"输入到系统日志,这个脚本其实很简单,之所以贴出来,是因为在分别使用insmod和staprun命令来执行生成的内核模块时,表现不一样,后面再说。将脚本保存为hello.stp。
2、生成内核模块
命令如下:

stap
-p4
-gu
-m hello hello.stp

-p选项用来指定在哪个阶段停止,这里是在compile阶段。
因为在脚本中嵌入了C代码,所以要指定-g选项进入guru模式,-u选项是禁止优化的选项,可选。
-m是指定生成的内核模块名称,这里生成的内核模块就是hello.ko。如果不使用-m选项,systemtap会将生成的内核模块放在用户目录的.systemtap目录下。没有指定的情况下,我的机器上生成的路径为/root/.systemtap/cache/e9/stap_e9ff1bc604b35641b8cec15699c7bfa0_791.ko,所以你懂的,最好要指定一下哦。
3、运行内核模块
命令如下:

staprun hello.ko

这里生成的hello.ko模块在使用staprun命令运行的时候,会在系统日志中显示"Hello,World!",但是直接使用insmod时,则没有看到,具体原因目前不详,有知道的希望不吝赐教,拜谢。
除非必须,不要把日志输出到系统日志,特别是量比较大的时候,否则会将重要的系统信息给冲掉。还是建议大家在使用的时候使用staprun命令来执行生成的内核模块,不要使用insmod或modprobe。在使用staprun的时候还可以使用-o选项来指定的输出的文件,如果不指定的话,脚本中的printf函数输出的信息是看不到的。
 

SystemTap----将SystemTap脚本编译成内核模块的更多相关文章

  1. 把perl脚本编译成exe

    来源:http://www.veryhuo.com/a/view/38338.html 今天想把 perl 脚本编译成 exe 以便脱离 perl 解释器独立运行.都可以生成PERL的PE文件,在PE ...

  2. Cocos2d-x使用Luajit将Lua脚本编译成bytecode,启用加密

    http://www.cocoachina.com/bbs/read.php?tid=205802 lua脚本进行加密,查了一下相关的资料 ,得知lua本身能够使用luac将脚本编译为字节码(byte ...

  3. python 脚本编译成可执行二进制(exe)

    本文python3,pyinstaller也支持py2 cmd下载模块pyinstaller 首先: pip install pyinstaller 其次: cmd下进入需要编译的xxx.py文件目录 ...

  4. PHP如何大幅度提升运行效率? -- 把它编译成机器码!

      书接上回   今天讨论如何大幅度提升PHP的运行效率. 在这,我们不纠结神马单双引号.全局变量.OO.require_once.错误抑制.... 在这,我们也不讨论APC.opcache.XCac ...

  5. 创建Unity新项目并编译成游戏程序

    注:本人所使用的Unity版本为:Unity5.3.5f1,所使用的VS版本为:Visual.Studio.2013.Ultimate 折腾了快一个月了,终于有时间做自己的啦,哈哈: ) 步骤一:启动 ...

  6. 通过ant脚本编译打包android工程

    通过ant脚本,编译打包android工程 1.Android程序编译.打包.签名.发布的三种方式:  方式一:命令行手动编译打包  方式二:使用ant自动编译打包  方式三:使用eclipse+AD ...

  7. 【转载】将python脚本打包成exe文件

    exe文件也就是可以直接执行的文件.通常我们编好的带py后缀的脚本文件都是需要在有python的环境下执 行,每次通过Win + R打开运行窗口再输入powershell打开控制台,再千辛万苦地cd ...

  8. ubuntu16.04编译安装mysql-boost-5.7.21并编译成php扩展测试与使用

    我之前的文章已经改造了自定义MVC框架中的工具类(验证码,图片上传,图像处理,分类)4个类,接下来,就要改造模型类,模型类肯定要连接数据库,由于我的Ubuntu Linux是裸装的php(目前只编译了 ...

  9. 使用py2exe将python脚本转换成exe可执行文件

    Python(wiki en  chs)是一门弱类型解释型脚本语言,拥有动态类型系统和垃圾回收功能,支持多种编程范式:面向对象.命令式.函数式和过程式编程. 由于Python拥有一个巨大而广泛的标准库 ...

随机推荐

  1. 从事web前端两年半后的迷茫

    做了两年半的重构,突然有种迷茫的感觉,好像瓶颈了,不知道自己该怎么继续走下去,以前刚毕业的时候,总觉得自己有好多的东西要学在前端方面,所以有那个促使自己去学习的动力,每当没工作任务的时候,自己总是去主 ...

  2. poj 1386 Play on Words(有向图欧拉路+并查集)

    题目链接:http://poj.org/problem?id=1386 思路分析:该问题要求判断单词是否能连接成一条直线,转换为图论问题:将单词的首字母和尾字母看做一个点,每个单词描述了一条从首字母指 ...

  3. Book of Evil 树双向DFS

    Book of Evil Paladin Manao caught the trail of the ancient Book of Evil in a swampy area. This area ...

  4. 查找jar包的站点

    1.findJAR.com: http://www.findjar.com/index.x 2.jarfire:  https://cn.jarfire.org/

  5. CRC32 vs Java.HashCode

    找了容量为27万中文词库进行试验    CRC32 中冲突率 < 0.01%    而 Java.HashCode 有 4%    hashCode 的速度 应该比 CRC 快 2-3 倍 CR ...

  6. poj1201 Intervals【差分约束+SPFA】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4303365.html   ---by 墨染之樱花 题目链接:http://poj.org/pr ...

  7. SharePoint BCS

    1. 开启相关的服务:管理中心-->应用程序管理-->管理服务器上的服务 2.

  8. [译]Stairway to Integration Services Level 11 - 日志配置

    介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...

  9. php怎样求一个数组中最长的

    <?php $arr = array( 0 => 'd', 1 => '68b3', 2 => 'a86', 3 => 'c9aa97b23b71d5c', 4 => ...

  10. git配合tortoiseGit的基础使用

    转载自:http://www.cnblogs.com/ssor/archive/2012/02/04/2337823.html 一定要自己写出来才能牢记,所以我来写一下 git确实比svn好用的多了, ...