Linux 调试: systemtap
安装与配置
在ubuntu下直接用apt-get install之后不能正常使用,提示缺少调试信息或者编译探测代码时有问题。
1. 采用官网上的解决方法
2. 可以自己重新编译一次内核,然后再手工编译一次systemtap。这样就可以正常使用了。
Systemtap的编译说明,除了下载地址并没有说太多东西。选择一个版本,自己选择了最新的2.7.
下载后解压,执行
./configure
一般来说会提示缺少组件。Systemtap最先应该是redhat开发的,所以需要的包名称ubuntu不能直接用来apt-get
列出几个自己碰到的依赖问题:
configure: error: missing gnu /usr/bin/msgfmt
apt-get install gettext
configure: error: missing elfutils development headers/libraries (install elfutils-devel, libebl-dev, libdw-dev and/or libebl-devel)
可以通过apt-get install libdw-dev解决
configure: error: in `/root/systemtap-2.7‘: configure: error: C++ preprocessor "/lib/cpp" fails sanity check
安装apt-get install g++
基本使用
详见systemtap 官方tutorial。这里做个笔记。
hello world
把systemtap脚本转换编译为内核模块然后执行预定义的动作,定义的动作由一系列的事件触发。用户可以指定在哪些事件上触发哪些指定的动作。下面是一个systemtap的helloworld,在模块装载即在脚本运行前执行一次
root@userver:~# stap hello-world.stp hello world root@userver:~# cat hello-world.stp probe begin { print ("hello world\n") exit () }
如果打开-v选项的话,可以看到执行的详细步骤:
root@userver:~# stap -v hello-world.stp Pass 1: parsed user script and 106 library script(s) using 66544virt/37432res/4324shr/33908data kb, in 120usr/10sys/127real ms. Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) using 67204virt/38136res/4512shr/34568data kb, in 0usr/0sys/4real ms. Pass 3: translated to C into "/tmp/stapyZxhXI/stap_847497c1de7927412685a2282f37c57d_881_src.c" using 67204virt/39028res/5232shr/34568data kb, in 0usr/0sys/0real ms. Pass 4: compiled C into "stap_847497c1de7927412685a2282f37c57d_881.ko" in 1000usr/590sys/1582real ms. Pass 5: starting run. helloworld Pass 5: run completed in 10usr/20sys/472real ms.
如果多次运行同一个脚本的话快很多,因为systemtap直接使用了已经编译好的缓存模块文件。
还可以定时运行一定时间:
root@userver:~# stap strace-open.stp cat(24307) open ("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) cat(24307) open ("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) cat(24307) open ("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) cat(24307) open ("iw.c", O_RDONLY) root@userver:~# cat strace-open.stp probe syscall.open { printf("%s(%d) open (%s)\n", execname(), pid(), argstr); } probe timer.ms(4000) # after 4 seconds { exit() }
在systemtap运行期间执行了一个cat命令得到的结果,脚本记录了执行系统调用open的进程信息。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。