systemtap 进阶
stap -e 'probe begin { log("hello world") exit() }'
从错误来看,只是比较时间上有差异,而且差别不大,如果能不比较该时间,或许问题就解决了(其实我们前面犯过一个不大不小的错误)
通过stap -v 选项 (可以多些几个v的,v越多信息越详细),如下:
然后打开文件: /tmp/stapjbY7L4/stap_19453_src.c ,错误位置如下:
从上图来看:
如果不去定义 常量 STAPCONF_GENERATED_COMPILE 就不会走到该逻辑,问题或许可以解决,那么 STAPCONF_GENERATED_COMPILE 是在哪里定义的呢?
其实就在旁边的一个 .h 中定义的,而该 .h 和该 .c 一样都是该目录下的Makefile 动态生成的,Makefile里面有如下逻辑:
@if $(CHECK_BUILD) $(SYSTEMTAP_RUNTIME)/linux/autoconf-generated-compile.c > /dev/null 2>&1; then echo "#define STAPCONF_GENERATED_COMPILE 1"; fi >> $@
不幸的是 Makefile本身也是动态生成的:
- 要么通过修改上述if逻辑中相关的某个文件,让返回值为“假”
我用到的是文件: /usr/share/systemtap/runtime/linux/autoconf-generated-compile.c 内容很简单:
#include <generated/compile.h> char* x = UTS_VERSION;
问题就来了, <generated/compile.h> 是哪个目录下的? - 要么找到生成Makefile的地方,去掉该逻辑
我简单找了一下,没找到
还有别的办法没?
因为systemtap依赖不多,其中一个rpm包就是kernel-devel,怀疑问题出现在kernel-devel ,那么去kernel-devel的文件中搜索 UTS_VERSION 这个常量试试,果然,发现文件: /usr/src/kernels/3.10.0-229.14.1.el7.x86_64/include/generated/compile.h (这不就是上面提到的 <generated/compile.h>嘛?)内容如下:
终于找到了 UTS_VERSION ,直接修改下这里的UTS_VERSION ,问题解决。
据说,这个常量信息是编译内核的时候自动生成的(从文件第一行也能看出来),所以,每次编译时间都会不一样,如果自己编译的内核,而去使用别人提供的kernel-devel,必然会遇到我这里出现的问题
上面提到说,我犯过一次错误,是这样的:
我的kernel-devel 是从 http://rpm.pbone.net/ 下载的,这里的rpm包有一个distribution的属性,由于rpm包大小相同,我就随便下载了一个,其实是有区别的,至少上面的时间是不同的,重新选择centos7的下载,重新安装,问题解决
新下载的rpm包中文件/usr/src/kernels/3.10.0-229.14.1.el7.x86_64/include/generated/compile.h 如下:
总结: systemtap 之所以入门较难,和苛刻 的内核版本号 以及yum安装的时候只安装最