Chinaunix

标题: 搞不懂为何有了kprobe了还要systemtap? [打印本页]

作者: todaygood    时间: 2014-01-01 20:52
标题: 搞不懂为何有了kprobe了还要systemtap?
systemtap能实现的功能kprobe都可以做,为了用systemtap学习那一套语言有些麻烦,因为不是经常用,过几天就忘了,搞不懂为何有了kprobe了还要systemtap?

大家来谈一谈,你为何用systemtap ?
我能想到的:
1.systemtap较用kprobe写内核模块要安全一些,systemtap脚本不会把系统crash掉,而写内核模块就不一样了. 至于为何安全,还没去研究,毕竟systemtap后面也是要加载内核模块的。

2.systemtap适合不会内核编程,C语言的人士使用,脚本语言方便。说实话对于我这种熟悉内核编程的人来说,相反systemtap还麻烦一些。


作者: humjb_1983    时间: 2014-01-02 08:55
todaygood 发表于 2014-01-01 20:52
systemtap能实现的功能kprobe都可以做,为了用systemtap学习那一套语言有些麻烦,因为不是经常用,过几天就忘 ...

systemtap是kprobe的封装,基于kprobe实现。个人觉得主要优势为:
1、动态调试。这个应该是最大的亮点,不需更换内核、不需重启系统,对于需要在线调试问题的应用场景来说,这个功能是非常关键的,因为很多疑难故障都是很难复现的,如果重启或更换内核,可能就很难再捕获到故障信息了。
2、使用方便,如你所说,由于使用脚本,不用手动编写C代码,模块编译以及加载模块的操作。只需要按照systemtap的语法编写脚本,其他操作都由Systemtap自动完成。
作者: todaygood    时间: 2014-01-02 09:01
1, kprobe也有。
2.使用方便是相对的,现网问题如使用systemtap需要安装一些包才行(一般现网环境不会去默认装这些运行时用不到的包),而kprobe模块拷过去直接插入,哪个方便?

个人觉得那一套语法是硬伤。
作者: todaygood    时间: 2014-01-02 09:05
脚本语言和C语言编程,无非就是脚本语言少了make而已,脚本语言一样的要调测,运行效率还低。
作者: humjb_1983    时间: 2014-01-02 09:32
todaygood 发表于 2014-01-02 09:01
1, kprobe也有。
2.使用方便是相对的,现网问题如使用systemtap需要安装一些包才行(一般现网环境不会去默 ...

呵呵,对kprobe不熟,systemtap用得比较多,systemtap与kprobe同源,个人理解systemtap的设计初衷应该主要是提高易用性。
作者: bboytaiwan    时间: 2014-01-02 19:09
差很多。systemtap支援regular expression,並且和symbol file做結合。

比方說我想要hook所有drivers/usb/host/ehci-hcd.c裡面的function。沒有systemtap,你只能一個一個自己用kprobe寫上去。
有systemtap他可以幫你作search,並且幫你把kprobe的code編譯好。
  1. probe kernel.function("*@drivers/usb/host/ehci-hcd.c").call {
  2.         printf("%s --> %s\n", thread_indent(1), probefunc())
  3. }

  4. probe kernel.function("*@drivers/usb/host/ehci-hcd.c").return {
  5.         printf("%s <-- %s\n", thread_indent(-1), probefunc())
  6. }
复制代码

作者: tempname2    时间: 2014-01-02 22:43
回复 1# todaygood


脚本语言做的事C都能做,为什么还要有脚本语言呢?

systemtap适合不会内核编程,C语言的人士使用,脚本语言方便。说实话对于我这种熟悉内核编程的人来说,相反systemtap还麻烦一些


搞笑了。真正Unix界出来的内核开发者(不是那些学完了C就去啃内核的人)绝大部分都熟悉某种脚本语言,而且极有可能甚于你对C语言的熟悉。
作者: tempname2    时间: 2014-01-02 23:13
Systemtap是为了要达到Dtrace的效果而做出来的,我记得它底层基本全是由kprobe实现的,现在或许加上了ftrace和perf,但整体体验还是不好。

(光是想象一下它底层做的事我就头皮发麻)

Systemtap各方面来看都与Dtrace相差甚远。现在有人在做ktap,设计思路与Dtrace类似,脚本最后编译为字节码,内核里实现一个小解释器。这比Systemtap轻量多了。用独立的程序编译脚本,而不像Systemtap需要一整套GCC工具链。生成的字节码平台无关,理论上来说跨平台调试很方便。社区的反应也非常好。Greg力推这个东西,上次擅自把它加到了staging树中。不过代码没经review就进去了遭Ingo质疑,最后被revert了。但是整个讨论中,perf方面的Ingo, ftrace方面的Steven Rostedt,都支持这个东西。Linus在讨论中也未表示反对。目前来看,ktap进主线应该只是时间问题。

PS: ktap作者是华为的工程师,这个feature要是进去了,可能是中国开发者贡献中,能见度最高的一个。

https://lwn.net/Articles/551314/

http://events.linuxfoundation.or ... cojp13_zhangwei.pdf
作者: humjb_1983    时间: 2014-01-03 09:08
tempname2 发表于 2014-01-02 23:13
Systemtap是为了要达到Dtrace的效果而做出来的,我记得它底层基本全是由kprobe实现的,现在或许加上了ftrac ...

这个工具看起来还不错,学习学习,新工具不断出,学习时间越发少,不得不感叹一下,快跟不上节奏咯~
作者: goldenfort    时间: 2014-01-03 09:58
回复 8# tempname2


    在 某公司干, 我呸。
作者: todaygood    时间: 2014-01-04 22:02
回复 7# tempname2
呵呵,比我高的人多了去,譬如你。

   
作者: todaygood    时间: 2014-01-04 22:04
回复 6# bboytaiwan
不错,发帖的本意就是要挖掘systemtap比kprobe的长处。

   
作者: todaygood    时间: 2014-01-04 22:24
回复 6# bboytaiwan

请教一下,经常编译出错,怎么办? 不知如何去解决,能说一下对付这种问题一般的方法是?

jun:/Linux/trouble/tools/systemtap/example # cat trace_route.stp



probe kernel.function("*@net/ipv4/route.c" ).return {
        printf("%s <-- %s\n", thread_indent(-1), probefunc())
}
jun:/Linux/trouble/tools/systemtap/example # stap -v trace_route.stp
Pass 1: parsed user script and 89 library script(s) using 70656virt/21520res/2364shr/19812data kb, in 200usr/20sys/223real ms.
Pass 2: analyzed script: 62 probe(s), 20 function(s), 4 embed(s), 2 global(s) using 254572virt/69488res/3524shr/67292data kb, in 630usr/110sys/764real ms.
Pass 3: translated to C into "/tmp/stapMb7Nvr/stap_602ef97f7b0f9c1f59fed946981310fc_22394_src.c" using 252200virt/72564res/6720shr/67292data kb, in 290usr/10sys/301real ms.
/tmp/stapMb7Nvr/stap_602ef97f7b0f9c1f59fed946981310fc_22394_src.c: In function ‘systemtap_module_init’:
/tmp/stapMb7Nvr/stap_602ef97f7b0f9c1f59fed946981310fc_22394_src.c:2541:3: error: implicit declaration of function ‘_stp_vma_init’ [-Werror=implicit-function-declaration]
cc1: all warnings being treated as errors
make[3]: *** [/tmp/stapMb7Nvr/stap_602ef97f7b0f9c1f59fed946981310fc_22394_src.o] Error 1
make[2]: *** [_module_/tmp/stapMb7Nvr] Error 2
make[1]: *** [sub-make] Error 2
make: *** [all] Error 2
WARNING: kbuild exited with status: 2
Pass 4: compiled C into "stap_602ef97f7b0f9c1f59fed946981310fc_22394.ko" in 2250usr/560sys/2835real ms.
Pass 4: compilation failed.  Try again with another '--vp 0001' option.

   
作者: todaygood    时间: 2014-01-04 22:41
回复 8# tempname2

你也承认systemtap的用户体验不是太好吧, 说是一种脚本语言,结果还是要转化成C语言编译,但又加入很多代码,编译出错了还不好定位修改,折腾这个东西真是有些费劲!!
   

作者: bboytaiwan    时间: 2014-01-05 11:30
我記得ubuntu內建的systemtap有些問題。可以試試看我自己上傳的systemtap: https://launchpad.net/~mimi0213kimo/+archive/test/+packages 回复 13# todaygood


   
作者: gacad    时间: 2014-01-05 12:47
本帖最后由 gacad 于 2014-01-05 12:48 编辑

一个全新的性能测量和调试诊断工具,
监控和跟踪运行中的Linux 内核的操作的动态方法。

与一种名为DTrace 的老技术相似,该技术源于Sun Solaris 操作系统。在DTrace 中,开发人员可以用D 编程语言(C 语言的子集,但修改为支持跟踪行为)编写脚本来保存应用编程接口
作者: 瀚海书香    时间: 2014-01-06 09:03
回复 1# todaygood
systemtap能实现的功能kprobe都可以做,为了用systemtap学习那一套语言有些麻烦,因为不是经常用,过几天就忘了,搞不懂为何有了kprobe了还要systemtap?

大家来谈一谈,你为何用systemtap ?
我能想到的:
1.systemtap较用kprobe写内核模块要安全一些,systemtap脚本不会把系统crash掉,而写内核模块就不一样了. 至于为何安全,还没去研究,毕竟systemtap后面也是要加载内核模块的。

2.systemtap适合不会内核编程,C语言的人士使用,脚本语言方便。说实话对于我这种熟悉内核编程的人来说,相反systemtap还麻烦一些


这两点就很重要了啊。

另外我这边经常用的一点就是,写好systemtap可以在centos和suse间无缝切换,而如果写kprobe的话,就需要自己适配不同的内核版本了。

   
作者: todaygood    时间: 2014-01-06 09:41
回复 17# 瀚海书香

内核版本切换容易,这个前提是脚本能正确编译通过生成ko文件, 感觉目前这个脚本语言的跨系统编译做得很不好。

我经常碰到在一个系统上stp脚本跑得没问题,换一个内核脚本编译阶段就出问题,譬如上面#13楼的问题。
   
作者: hejianet    时间: 2014-01-08 13:39
回复 13# todaygood


    试下helloworld?
这么简单的stp脚本出错的话,应该是你环境没有配置好

作者: todaygood    时间: 2014-01-08 16:28
回复 19# hejianet


    jun:/Linux/trouble/tools/systemtap/example # stap -v hello.stp
Pass 1: parsed user script and 89 library script(s) using 70660virt/21520res/2364shr/19816data kb, in 200usr/30sys/476real ms.
Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) using 71188virt/22280res/2472shr/20344data kb, in 0usr/0sys/49real ms.
Pass 3: translated to C into "/tmp/stapIGTcfX/stap_8f09c1af3ea1607e23732126905e0e61_964_src.c" using 71188virt/22820res/2960shr/20344data kb, in 0usr/0sys/0real ms.
Pass 4: compiled C into "stap_8f09c1af3ea1607e23732126905e0e61_964.ko" in 10710usr/1690sys/17946real ms.
Pass 5: starting run.
hello world
Pass 5: run completed in 20usr/60sys/387real ms.
jun:/Linux/trouble/tools/systemtap/example # cat hello.stp
probe begin
{
printf("hello world\n")
exit()
}

jun:/Linux/trouble/tools/systemtap/example # stap -v trace_route.stp
Pass 1: parsed user script and 89 library script(s) using 70660virt/21528res/2364shr/19816data kb, in 200usr/20sys/221real ms.
Pass 2: analyzed script: 62 probe(s), 20 function(s), 4 embed(s), 2 global(s) using 254572virt/69488res/3524shr/67292data kb, in 670usr/350sys/8707real ms.
Pass 3: translated to C into "/tmp/stapjiABQJ/stap_2f7c773e1a90df417f431118bb8ecda8_22394_src.c" using 252200virt/72564res/6720shr/67292data kb, in 300usr/10sys/595real ms.
/tmp/stapjiABQJ/stap_2f7c773e1a90df417f431118bb8ecda8_22394_src.c: In function ‘systemtap_module_init’:
/tmp/stapjiABQJ/stap_2f7c773e1a90df417f431118bb8ecda8_22394_src.c:2541:3: error: implicit declaration of function ‘_stp_vma_init’ [-Werror=implicit-function-declaration]
cc1: all warnings being treated as errors
make[3]: *** [/tmp/stapjiABQJ/stap_2f7c773e1a90df417f431118bb8ecda8_22394_src.o] Error 1
make[2]: *** [_module_/tmp/stapjiABQJ] Error 2
make[1]: *** [sub-make] Error 2
make: *** [all] Error 2
WARNING: kbuild exited with status: 2
Pass 4: compiled C into "stap_2f7c773e1a90df417f431118bb8ecda8_22394.ko" in 2250usr/530sys/2972real ms.
Pass 4: compilation failed.  Try again with another '--vp 0001' option.

作者: hejianet    时间: 2014-01-09 11:08
回复 20# todaygood

[root@localhost stap_exercise]#  stap -v ./trace_route.stp
Pass 1: parsed user script and 147 library script(s) using 373420virt/188288res/2968shr/188696data kb, in 0usr/1080sys/1402real ms.
Pass 2: analyzed script: 65 probe(s), 13 function(s), 4 embed(s), 2 global(s) using 579452virt/241872res/4228shr/242100data kb, in 920usr/1930sys/15332real ms.
Pass 3: translated to C into "/tmp/stapxauSja/stap_48850f8913e5d01d8b2093a1df95c209_17460_src.c" using 576988virt/244696res/7172shr/242100data kb, in 400usr/0sys/193real ms.
Pass 4: compiled C into "stap_48850f8913e5d01d8b2093a1df95c209_17460.ko" in 6890usr/1260sys/10813real ms.
Pass 5: starting run.
    swapper/1(0): <-- arp_process
    sshd(9711): <-- tcp_current_mss
  17 sshd(9711): <-- __sk_dst_check
  43 sshd(9711): <-- ip_finish_output
97878 swapper/1(0): <-- ip_rcv_finish
97892 swapper/1(0): <-- tcp_v4_do_rcv
200108 sshd(9711): <-- tcp_current_mss
200118 sshd(9711): <-- __sk_dst_check
200130 sshd(9711): <-- ip_finish_output
298001 swapper/1(0): <-- ip_rcv_finish
    。。。。

[root@localhost stap_exercise]# rpm -qa |grep systemtap
systemtap-devel-2.3-1.fc19.x86_64
systemtap-client-2.3-1.fc19.x86_64
systemtap-runtime-2.3-1.fc19.x86_64
systemtap-2.3-1.fc19.x86_64
[root@localhost stap_exercise]# uname -a
Linux localhost.localdomain 3.9.5-301.fc19.x86_64 #1 SMP Tue Jun 11 19:39:38 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
作者: todaygood    时间: 2014-01-09 22:18
jun:/etc/sysconfig/network # uname -a
Linux jun.suse.com 3.7.10-72.g8ec70cd-desktop #1 SMP PREEMPT Fri Nov 22 12:47:48 UTC 2013 (8ec70cd) x86_64 x86_64 x86_64 GNU/Linux
jun:/etc/sysconfig/network # cat /etc/SuSE-release
openSUSE 12.3 (x86_64)
VERSION = 12.3
CODENAME = Dartmouth
jun:/etc/sysconfig/network # rpm -qa | grep systemtap
systemtap-runtime-2.0-2.4.1.x86_64
systemtap-2.0-2.4.1.x86_64

作者: hejianet    时间: 2014-01-10 10:09
这个版本systemtap-2.0+ 貌似发布很久了,试下更新到最新的版本,或者自己下源代码编译最新的版本
https://sourceware.org/bugzilla/show_bug.cgi?id=14712 比较可疑
1.相似的错误
2.发布时间恰好在systemtap-2.0之后
仅供参考

作者: todaygood    时间: 2014-01-13 22:28
回复 23# hejianet
应该是这个问题,thanks.

BTW: 我之所以觉得systemtap不好,主要是我一直不需要使用systemtap优点的地方,相反经常碰到其弱点的地方。
   
作者: xs3c    时间: 2014-01-16 13:01
回复 8# tempname2
感觉像是日本人.


   
作者: yg_quantum    时间: 2014-12-26 10:38
麻烦大神们看看这个帖子,给回复一下,谢谢


kprobes如何进行单步调试
http://bbs.chinaunix.net/forum.p ... mp;fromuid=28536038

作者: yg_quantum    时间: 2014-12-30 11:40
再请教一个问题,就是 kprobe 的 post里面,可以得到当前执行过的语句的 寄存器的值,寄存器的值不直观,怎么能做的让他显示更直观呢?
作者: sky__sea    时间: 2016-04-29 14:08
不错,学习了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2