Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299907
  • 博文数量: 40
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 535
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-17 14:08
文章分类

全部博文(40)

文章存档

2011年(1)

2010年(10)

2009年(29)

我的朋友

分类: LINUX

2010-01-04 20:54:42

最近使用到了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到目标机里面就可以了。
阅读(6232) | 评论(0) | 转发(0) |
0

上一篇:gcc内嵌汇编用法

下一篇:Jtag+OpenOCD+GDB调试

给主人留下些什么吧!~~