科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Linux系统中使用SystemTap调试内核 (2)

Linux系统中使用SystemTap调试内核 (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

直接运行脚本文件(需要可执行属性并且第一行加上#!/usr/bin/stap):./脚本文件名用"Ctrl+C"中止SystemTap的运行。

作者:www-128.ibm.com 来源:www-128.ibm.com 2007年10月22日

关键字: 内核 调试 SystemTap Linux

  • 评论
  • 分享微博
  • 分享邮件
 

运行SystemTap有三种形式:

1. 从文件(通常以.stp作为文件名后缀)中读入并运行脚本:stap [选项] 文件名。

2. 从标准输入中读入并运行脚本: stap [选项]。

3. 运行命令行中的脚本:stap [选项] -e 脚本。

4. 直接运行脚本文件(需要可执行属性并且第一行加上#!/usr/bin/stap):./脚本文件名用"Ctrl+C"中止SystemTap的运行。

systemtap的选项还在不断的扩展和更新中,其中最常用的选项包括:

-v -- 打印中间信息;

-p NUM -- 运行完Pass Num后停止(缺省是运行到Pass 5);

-k -- 运行结束后保留临时文件不删除;

-b -- 使用RelayFS文件系统来将数据从内核空间传输到用户空间;

-M -- 仅当使用-b选项时有效,运行结束时不合并每个CPU的单独数据文件;

-o FILE -- 输出到文件,而不是输出到标准输出;

-c CMD -- 启动探测后,运行CMD命令,直到命令结束后退出;

-g -- 采用guru模式,允许脚本中嵌入C语句;

其它更多选项请参看stap的手册。

SystemTap的语法

我们利用一个简单的systemtap脚本来介绍一下SystemTap的语法:

#!/usr/local/bin/stap
global count
function report(stat) {
        printf("stat=%d\n", stat)
}
probe kernel.function("sys_read") {
        ++count
}
probe end {
        report()
}

探测点(probe):每个systemtap脚本中至少需要定义一个探测点,也就是指定了在内核的什么位置进行探测。探测点名称后面紧跟的一组大括号内定义了每次内核运行到该探测点时需要运行的操作,这些操作完成后再返回探测点,继续下面的指令。这里给出了systemtap目前支持的所有探测点类型。

全局变量(global):用来定义全局变量。单个探测点函数体中使用的局部变量不需要预先定义,但是如果一个变量需要在多个探测点函数体中使用,则需要定义为全局变量。

函数(function):用来定义探测点函数体中需要用到的函数。除了可以用脚本语言定义函数以外,还可以用C语言来定义函数,只是这时函数名后面的大括号对需要换成%{ %}。例如,前面的report()函数可以写成:

function report(stat) %{
  _stp_printf("stat=%d\n", THIS->stat);
 %}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章