内核调试神器SystemTap — 简单介绍与使用(一)
a linux trace/probe tool.
官网:https://sourceware.org/systemtap/
简单介绍
SystemTap是我眼下所知的最强大的内核调试工具,有些家伙甚至说它无所不能:)
(1) 发展历程
Debuted in 2005 in Red Hat Enterprise Linux 4 Update 2 as a technology preview.
After four years in development, System 1.0 was released in 2009.
As of 2011 SystemTap runs fully supported in all Linux distributions.
(2) 官方介绍
SystemTap provides free software(GPL) infrastructure to simplify the gathering of information about the
running Linux system. This assists diagnosis of a performance or functional problem. SystemTap eliminates
the need for the developer to go through the tedious and disruptive instrument, recompile, install, and reboot
sequence that may be otherwise required to collect data.
SystemTap provides a simple command line interface and scripting language for writing instrumentation for
a live running kernel plus user-space application. We are publishing samples, as well as enlarging the internal
"tapset" script library to aid reuse and abstraction.
Among other tracing/probing tools, SystemTap is the tool of choice for complex tasks that may require live analysis,
programmable on-line response, and whole-system symbolic access. SystemTap can also handle simple tracing
jobs.
Current project members include Red Hat, IBM, Hitachi, and Oracle.
(3) 获取源代码
git clone git://sourceware.org/git/systemtap.git
安装
(1) Ubuntu发行版
1. 安装systemtap包
apt-get install systemtap
2. 安装依赖包
gcc:C语言编译器
elfutils:提供分析调试信息的库函数
linux-headers-generic:编译内核模块所需的内核头文件以及模块配置信息
3. 安装内核调试信息(kernel-debuginfo)
kernel-debuginfo提供了调试内核所需的符号表,假设没有安装的话SystemTap的威力就会大打折扣,
仅仅能提供kprobes系列的功能。
下载地址:http://ddebs.ubuntu.com/pool/main/l/linux/
下载相应的内核版本号,我的是linux-image-3.11.0-12-generic-dbgsym_3.11.0-12.19_amd64.ddeb
下载后安装:dpkg -i linux-image-3.11.0-12-generic-dbgsym_3.11.0-12.19_amd64.ddeb
4. 验证
stap -ve 'probe kernel.function("do_fork") { print("hello world\n") exit() }'
假设没有提示错误,就是成功安装了。
(2) CentOS/RedHat发行版
使用yum安装下列rpm包就可以:
systemtap:SystemTap包
gcc:C语言编译器
elfutils:提供库函数来分析调试信息
kernel-devel:编译内核模块所需的内核头文件及模块配置信息
kernel-debuginfo:提供所需的内核调试信息来定位内核函数和变量的位置
使用
一些样例SystemTap的简单样例。
(1) stap
通常直接使用stap运行用SystemTap语法编写的脚本就可以。
stap - systemtap script translator/driver
stap test.stp // .stp后缀的文件是用SystemTap语法编写的脚本
脚本主要元素:probe point + probe handler
stap [options] FILE // Run script in file
stap [options] -e SCRIPT // Run given script.
stap [options] -l PROBE // List matching probes.
stap [options] -L PROBE // List matching probes and local variables.
经常使用选项
-h:帮助
-g:guru模式,嵌入式C代码须要
-m:指定编译成的模块名称
-v:add verbosity to all passes
-k:不删除暂时文件夹
-p NUM:stop after pass NUM 1-5, instead of 5 (parse, elaborate, translate, compile, run)
-b:bulk (percpu file) mode, 使用RelayFS将数据从内核空间传输到用户空间
-o FILE:输出到指定文件,而不是stdout
-c CMD:start the probes, run CMD, and exit when it finishes
stap是SystemTap的前端。当出现下面情况时退出:
1. The user interrupts the script with a CTRL-C.
2. The script executes the exit() function.
3. The script encounters a sufficient number of soft errors.
4. The monitored command started with the stap program's -c option exits.
(2) staprun
假设我们的输入不是.stp脚本,而是一个用stap生成的模块。那么就用staprun来运行。
staprun - systemtap runtime
staprun [OPTIONS] MODULE [MODULE-OPTIONS]
staprun的作用:
The staprun program is the back-end of the Systemtap tool. It expects a kernel module produced by
the front-end stap tool.
Splitting the systemtap tool into a front-end and a back-end allows a user to compile a systemtap script
on a development machine that has the kernel debugging information (need to compile the script) and
then transfer the resulting kernel module to a production machine that doesn't have any development
tools or kernel debugging information installed.
staprun is a part of the SystemTap package, dedicated to module loading and unloading and kernel-to-user
data transfer.
经常使用选项
-o FILE:Send output to FILE.
-D:Run in background. This requires '-o' option.
(3) 监測内核函数
一个简单脚本,每当内核函数do_fork()被调用时。显示调用它的进程名、进程ID、函数參数。
global proc_counter probe begin {
print("Started monitoring creation of new processes...Press ^C to terminate\n")
printf("%-25s %-10s %-s\n", "Process Name", "Process ID", "Clone Flags")
} probe kernel.function("do_fork") {
proc_counter++
printf("%-25s %-10d 0x%-x\n", execname(), pid(), $clone_flags)
} probe end {
printf("\n%d processes forked during the observed period\n", proc_counter)
}
(4) 监測系统调用
一个简单脚本。显示4秒内open系统调用的信息:调用进程名、进程ID、函数參数。
probe syscall.open
{
printf("%s(%d) open(%s)\n", execname(), pid(), argstr)
} probe timer.ms(4000) # after 4 seconds
{
exit()
}
(5) 监測源文件里全部函数入口和出口
括号内的探測点描写叙述包括三个部分:
function name part:函数名
@file name part:文件名称
function line part:所在行号
比如:
probe kernel.function("*@net/socket.c") {}
probe kernel.function("*@net/socket.c").return {}
这里指定函数名为随意(用*表示),指定文件名称为net/socket.c。探測函数的入口和返回。
还能够用“:行号”来指定行号。
(6) 查找匹配的内核函数和变量
查找名字中包括nit的内核函数:
stap -l 'kernel.function("*nit*")'
查找名字中包括nit的内核函数和变量:
stap -L 'kernel.function("*nit*")'
(7) 自带的用例集
/root/systemtap/testsuite/systemtap.examples/。包括了很多用例脚本。
主要有几个方面:
network、io、interrupt、locks、memory、process、virtualization等
(8) 监控全部进程的收发包情况
global recv, xmit probe begin {
printf("Starting network capture...Press ^C to terminate\n")
} probe netdev.receive {
recv[dev_name, pid(), execname()] <<< length
} probe netdev.transmit {
xmit[dev_name, pid(), execname()] <<< length
} probe end {
printf("\nCapture terminated\n\n")
printf("%-5s %-15s %-10s %-10s %-10s\n",
"If", "Process", "Pid", "RcvPktCnt", "XmtPktCnt") foreach([dev, pid, name] in recv) {
recvcnt = @count(recv[dev, pid, name])
xmtcnt = @count(xmit[dev, pid, name])
printf("%-5s %-15s %-10d %-10d %-10d\n", dev, name, pid, recvcnt, xmtcnt)
}
}
(9) Systemtap usage stories and interesting demos
https://sourceware.org/systemtap/wiki/WarStories
官网提供的非常多样例。
内核调试神器SystemTap — 简单介绍与使用(一)的更多相关文章
- 内核调试神器SystemTap — 简介与使用(一)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 简介 SystemTap是我目前所知的最强大的内核调试工具,有些家伙甚至说 ...
- 内核调试神器SystemTap — 更多功能与原理(三)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 用户空间 SystemTap探测用户空间程序需要utrace的支持,3.5 ...
- 内核调试神器SystemTap — 探测点与语法(二)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 探测点 SystemTap脚本主要是由探测点和探测点处理函数组成的,来看下 ...
- 内核调试神器SystemTap — 探測点与语法(二)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 探測点 SystemTap脚本主要是由探測点和探測点处理函数组成的,来看下 ...
- 内核调试神器SystemTap 转摘
http://blog.csdn.net/zhangskd/article/details/25708441 https://sourceware.org/systemtap/wiki/WarStor ...
- eclipse的调试方法的简单介绍
声明:本文不是自己 作为编程人员,程序的调试是一项基本功.在不使用IDE的时候,程序的调试多数是通过日志或者输入语句(System.out.println)的方式.可以把程序运行的轨迹或者程序运行过程 ...
- Linux内核剖析 之 进程简单介绍
1.概念 1.1 什么是进程? 进程是程序运行的一个实例.能够看作充分描写叙述程序已经运行到何种程度的数据结构的汇集. 从内核观点看.进程的目的就是担当分配系统资源(CPU时间,内存 ...
- 运维神器Chef简单介绍和安装笔记
首先大概解释一下Chef Chef有三个重要的概念:(如上图所示) 它们的合作关系大致是这样的, Workstation把资源或者说是一些要被运行的命令上传到Chef-Server上, Nodes自动 ...
- Dubbo原理解析-Dubbo内核实现之SPI简单介绍
转自:https://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 Dubbo 采用微内核+插件体系,使得设计优雅,扩展性强.那所谓 ...
随机推荐
- 题解 UVA10587 【Mayor's posters】
先讲一下:dalao @lisuier 发布的前一篇题解严格来讲是有错误的 比如下一组数据: 1 3 1 10 1 4 7 10 显然答案是3,然而用lisuier dalao的程序做出来的答案是2( ...
- 猜拳游戏项目(涉及知识点Scanner、Random、For、数组、Break、Continue等)
package day03.d3.xunhuankongzhi; import java.util.Scanner; public class CaiQuan { public static void ...
- Django中的bug总结
1.插入数据库的时候,少写一个字段.ps:看准数据库的字段,是不是非空,是不是外键. 2.当同一个视图中需要连续操作两个数据表时,先看好两个表的外键之间的关系,再进行操作表.比如:一个订单表order ...
- python--3、函数
定义: 定义函数时,也相当于定义变量.会把函数体内的代码存入开辟的内存空间中.使用函数时,通过func() 声明是函数,其对应的值为代码.函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执 ...
- 打开手机摄像头扫描二维码或条形码全部操作(代码写的不好,请提出指教,共同进步,我只是一个Android的小白)
(1)下载二维码的库源码 链接:http://pan.baidu.com/s/1pKQyw2n 密码:r5bv 下载完成后打开可以看到 libzxing 的文件夹,最后添加进 Android Stu ...
- SqlServer 导出指定表数据 生成Insert脚本
版权声明:本文为博主原创文章,未经博主允许不得转载.
- Yearning + Inception SQL审核平台搭建
Yearning 安装: 安装Nginxyum install nginx -y 按照顺序安装MySQLmysql-community-common-5.7.22-1.el6.x86_64.rpmmy ...
- MSCRM4 在过滤后的LOOKUP框中实现查找
在MSCRM中让Lookup根据一定的条件实现过滤功能, 这个需求很常见, 在我接触的诸多项目中似乎都需要有这个功能. 但非常遗憾是, MSCRM 的SDK并没有提供实现这个功能的方法. 不过我们应该 ...
- VR: AR和VR演进哲学
Facebook 20亿美元(4亿美元+16亿美元股票换购方式)收购虚拟现实厂商Oculus 引爆AR产业,索尼不温不火逐步演进的头盔项目也该加速了.最近Oculus rift发布了商业版本:Ocul ...
- java 发送http请求
参考别人的 package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS ...