最近使用到了Linux内核新的调试工具systemtap,感觉真的是很强大.
这里是它的网站,有详尽的资料可以参考
那篇IBM的红宝书写到是相当的好,重点看那篇就可以了。
使用过程中,遇到了几个问题,也在网上参加了讨论,这里记录一下,以备忘
讨论的帖子在这里:
1. 外部编译的内核模块符号找不到的问题
如果想在linux内核树外部编译一个内核模块,比如写一个testmodule,位于内核树外面,当然Makefile是这样写的
KDIR=/ora/code/linux-2.6.29
PWD=`pwd`
obj-m:=mytest.o
default:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
写的stp
probe module("mymodule").function("myfunc"){
printf("this is my func\n");
}
编译
./stap -r /ora/code/linux-2.6.29/ test.stp -m test
报的错误
semantic
error: missing x86_64 kernel/module debuginfo under
'/ora/code/linux-2.6.29/' while resolving probe point
module("mymodule").function("myfunc").
后来仔细分析,测试,推测是这样的,stap找符号表,
对kernel的函数,找的应该是vmlinux这个文件,如果是module.function,查看的应该是linux-2.6.29/modules.order,这里面记录的是内核的ko文件。但因为编译的测试模块是在内核树外面编译的,所以这个文件里不会记录对应的
ko。
那解决方法就是把外部的ko所在目录做一个符号链接进来。比如放到内核driver目录下面,然后手工添加ko路径到那个modules.order里面。
感觉这样做还是有些麻烦,可也找不到好的方法。
stap命令好像有个-d选项可以指定路径,但我指向了,还是不太好使。另外我发现在内核下面的modules.order里面还必须加入的是
kernel/打头的,写绝对路径是不行的,不知道这个是不是stap的强制要求。所以必须搞符号链接。
还有,自己生成test模块时其实也会生成对应的modules.order文件,但里面的内容是kernel//ora/code/testmod
/mytest.ko, 这个路径应该是错误的吧?不知道为什么会生成这样的内容。
2. 第二种是关于交叉编译的问题。
刚刚
release的1.0版本说支持交叉编译的,就是说编译的时候用 stap -r /path test.stp -m
test,就会生成对应的ko,然后在目标机器上只需要用staprun加载生成的test.ko文件就行了。按理说只需要拷贝test.ko和
staprun文件到目标机上就可以了,但我这样做的时候,加载的时候会提示找不到其它依赖的文件(依赖的文件也是stap目录里面的),我现在的解决办
法是把整个stap目录导出,然后在目标机上mount过来,才可以运行成功。而且在目标机上stap的目录也要和宿主机路径保持一模一样的才行。
这个问题: 只需要拷贝staprun和stapio到目标机里面就可以了。
阅读(6221) | 评论(0) | 转发(0) |