systemtap调试linux内核源码,linux调试工具SystemTap

最近使用到了Linux内核新的调试工具systemtap,感觉真的是很强大.

这里是它的网站,有详尽的资料可以参考 http://sourceware.org/systemtap/wiki

那篇IBM的红宝书写到是相当的好,重点看那篇就可以了。

使用过程中,遇到了几个问题,也在网上参加了讨论,这里记录一下,以备忘

讨论的帖子在这里:

http://www.osplay.org/modules/newbb/viewtopic.php?topic_id=45&forum=10

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到目标机里面就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值