系统环境
linux发行版
ubuntu 12.04.5 内核 3.13.0-32-generic
安装包
使用apt-get安装systemtap没法用,因为太老了,默认是1.6版本。现在已经出到了3.0.曾经换过好几个内核版本,都安装默认的systemtap 报编译错误。卡在第四步。错误如下:
感觉ubuntu老的版本内核更新很快,但是软件更新跟不上。后来参考了自定义安装systemtap才搞定。其中曲折实在是令人心塞。现在记录下来,希望遇到这个错误的人不用再试系统版本了,直接自己编译就好了。
内核debuginfo对应的包:http://ddebs.ubuntu.com/pool/main/l/linux-lts-trusty/
最近的elfultils的下载地址:https://fedorahosted.org/releases/e/l/elfutils/
最新systemtap 的下载地址:http://sourceware.org/systemtap/ftp/releases/
安装步骤
因为systemtap需要内核的调试信息,所以先去debuginfo网站下载自己的内核所对应的dbgsym包。因为systemtap对内核的检查机制非常严格,所以如果只是使用uname -r 查看,会省略内核的小版本号。比如3.13.0-32-generic。实际上还有小版本号。如下图所示:
可以看到其实真正的版本号应该是3.13.0-32.57~precise1,所以我们下载dbgsym包的时候要看准内核号。
这个下载完后就安装。命令如下:
sudo dpkg -i linux-image-3.13.0-32-generic-dbgsym_3.13.0-32.57~precise1_amd64.ddeb
1)卸载系统已经安装的systemtap(发行版对应的):
首先,如果你的系统已经使用apt-get安装了systemtap,尽量在这一步先卸载已经安装的systemtap。如果不进行卸载,调用的命令stap来自于原来已经安装的systemtap,是无法在新内核上运行的。
2)安装systemtap和elfutils:
下载最新的systemtap和elfutils源码:注意,此处一定要下载最新的源码自己安装,否则可能会造成编译以后的软件无法运行
一块编译:
将2个包解压到2个不同的目录,然后进入systemtap包目录,执行
./configure –with-elfutils=/path/to/elfutils-dir –prefix=yourpatch
make
make install
总结:这一步的关键是软件版本一定要是最新的(如果测试最新内核),环境变量要进行设置。
注意:如果我们设置了安装路径,一定要把对应systemtap安装路径下面的bin添加到环境变量PATH之中,否则调用stap的时候会发现找不到这个程序。
安装完成以后,我们使用下面的shell命令进行测试,如果输出hello world,说明systemtap安装成功。
$:stap -ve 'probe begin { log("hello world") exit() }'
运行这个命令时,最好将用户加入到stapdev用户组中。省的老是使用root权限。
命令如下:
sudo usermod -a -G stapdev $USER