systemtap 进阶

执行hello word命令出错:

从错误来看,只是比较时间上有差异,而且差别不大,如果能不比较该时间,或许问题就解决了(其实我们前面犯过一个不大不小的错误)

通过stap -v 选项 (可以多些几个v的,v越多信息越详细),如下:

然后打开文件: /tmp/stapjbY7L4/stap_19453_src.c ,错误位置如下:

从上图来看:

如果不去定义 常量 STAPCONF_GENERATED_COMPILE 就不会走到该逻辑,问题或许可以解决,那么 STAPCONF_GENERATED_COMPILE 是在哪里定义的呢?

其实就在旁边的一个 .h 中定义的,而该 .h 和该 .c 一样都是该目录下的Makefile 动态生成的,Makefile里面有如下逻辑:

不幸的是 Makefile本身也是动态生成的:

  1. 要么通过修改上述if逻辑中相关的某个文件,让返回值为“假”
    我用到的是文件: /usr/share/systemtap/runtime/linux/autoconf-generated-compile.c 内容很简单:

    问题就来了, <generated/compile.h>  是哪个目录下的?
  2. 要么找到生成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 其它版本的也能找到,在这里 如果搜索不到的话,可以按照字母顺序找找,可能搜索不好使

 

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据