ERROR: module version mismatch

来源:互联网 发布:新生入学调查问卷知乎 编辑:程序博客网 时间:2024/05/22 03:20

systemtap 进阶


执行hello word命令出错:
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本身也是动态生成的:

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

    问题就来了, <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安装的时候只安装最

阅读全文
0 0
原创粉丝点击