systemtap PHP,systemtap初体验

写在前面:

systemtap依赖的debuginfo可以从这里(http://debuginfo.centos.org/6/x86_64/)找到,如果幸运的话,你可以直接yum install kernel-debuginfo kernel-debuginfo-common来安装;

不过,正确的安装姿势应该是:

yum update kernel-*      (没有这个将可能出现很多不必要的麻烦)

reboot

yum install systemstap

stap-prep

话说systemtap是一个非常强悍的linux调试工具,但是似乎并不是特别的常用,今天尝试用了一下,确实有一些心得。

安装:

yum install systemtap

1

yuminstallsystemtap

然后就有systap命令了,弄个脚本试试跑跑吧:

stap -e 'probe begin { log("hello world") exit() }'

1

stap-e'probe begin { log("hello world") exit() }'

有错误了:

Checking "/lib/modules/2.6.32-431.el6.x86_64/build/.config" failed with error: 没有那个文件或目录

Incorrect version or missing kernel-devel package, use: yum install kernel-devel-2.6.32-431.el6.x86_64

1

2

Checking"/lib/modules/2.6.32-431.el6.x86_64/build/.config"failedwitherror:没有那个文件或目录

Incorrectversionormissingkernel-develpackage,use:yuminstallkernel-devel-2.6.32-431.el6.x86_64

大致如上,可能版本号有所差异;好歹有提示,那就照做;不过,可能你确实已经安装了对应版本的kernel-devel; 你们不防rpm -ql kernel-devel 看看安装到哪里了,如果是 /usr/src/kernels/2.6.32-431.el6.x86_64 那么不妨执行:

ln -s /usr/src/kernels/2.6.32-431.el6.x86_64 /lib/modules/2.6.32-431.el6.x86_64/build

1

ln-s /usr/src/kernels/2.6.32-431.el6.x86_64 /lib/modules/2.6.32-431.el6.x86_64/build

其实可以这样:

stap-prep

1

stap-prep

该命令可以帮你安装需要的依赖,主要是kernel-devel 和 kernel-debuginfo; 关键是要安装指定的版本,版本错了不行,如果使用的是本地的yum源,可能找不到指定的版本号的包,这样可以修改为使用官方的yum源,这可能是一个比较慢的过程,因为kernel-debuginfo 大小可能超过1G;单从这个来看,该工具的使用成本还是不小的; 也很有可能你配置了debuginfo的yum源,但是没有enable,可以在yum时候临时enable一下,eg:

yum --enablerepo=*-debuginfo install kernel-debuginfo-3.10.0-327.13.1.el7.x86_64

1

yum--enablerepo=*-debuginfoinstallkernel-debuginfo-3.10.0-327.13.1.el7.x86_64

安装完后再次执行:

stap -e 'probe begin { log("hello world") exit() }'

1

stap-e'probe begin { log("hello world") exit() }'

果然有hello world输出,再来一个 profile.stp:

global syscalllist

probe begin {

printf("System Call Monitoring Started (10 seconds)...\n")

}

probe syscall.*

{

syscalllist[pid(), execname()]++

}

probe timer.ms(10000) {

foreach ( [pid, procname] in syscalllist ) {

printf("%s[%d] = %d\n", procname, pid, syscalllist[pid, procname] )

}

exit()

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

globalsyscalllist

probebegin{

printf("System Call Monitoring Started (10 seconds)...\n")

}

probesyscall.*

{

syscalllist[pid(),execname()]++

}

probetimer.ms(10000){

foreach([pid,procname]insyscalllist){

printf("%s[%d] = %d\n",procname,pid,syscalllist[pid,procname])

}

exit()

}

9080119225d87520871a8abd6b47b90d.png

使用场景

看看哪个进程在查询dns

dns.stp:

probe udp.sendmsg {

if ( dport == 53 ) {

printf ("PID %5d (%s) sent UDP to %15s 53\n", pid(), execname(), daddr)

}

}

1

2

3

4

5

probeudp.sendmsg{

if(dport==53){

printf("PID %5d (%s) sent UDP to %15s 53\n",pid(),execname(),daddr)

}

}

07e331c06bb43c520013f35835985795.png

参考资料:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值