执行hello word命令出错:
1 |
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里面有如下逻辑:
1 |
@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 内容很简单:
123#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安装的时候只安装最新的rpm包有极大关系,yum源中可能找不到自己内核版本的kernel-devel
参考资料:
http://blog.yufeng.info/archives/1098
http://blog.csdn.net/zhangskd/article/details/25708441
安装正确的debuginfo版本是非常重要的,对于fedora系统来将,yum中找不到的,可以直接去build系统中找,如,我的fedora的kernel相关rpm包: https://koji.fedoraproject.org/koji/buildinfo?buildID=1426588 其它版本的也能找到,在这里 如果搜索不到的话,可以按照字母顺序找找,可能搜索不好使