怎么用truss监控进程

   最近因为一个程序bug需要用truss监控进程的系统调用情况。一点心得,记录在此。

 

   原因是一个C++程序,在调用system()方法时,有时会变得很慢,所以用truss监控一下哪里出了问题。

 

   首先是参数,-D 可以显示每条系统调用的时间花费,-d 可以显示时间戳,最重要的是-f , 因为是通过system()方法调用系统方法,会fork新的进程,所以要用-f 监控子进程的状况。

 

   还有一点就是,我的进程在SUN Cluster 监控之下,所以要先释放出来

/usr/cluster/lib/sc/pmfctl -S $PID
 

    然后是truss 命令

truss -dDeal -t '!lwp_park' -f  -o truss.out -p $PID

    使用-t '!lwp_park' 过滤掉不必要的输出,-o 指定输出的文件, -p 指定监控的进程号

 

    这样对一般的需求应该够了,但是要长期监控的话,输出就会很多,而且因为是truss自己控制输出,我们再来针对truss.out 做rotate就会遇到麻烦,比如,你如果用命令

echo "" > truss.out
touch truss.out

    尝试清空内容的话,你会发现文件大小没有变化,用vi打开,内容的确没了,但是你会发现vi显示有很多的 null character,用less命令打开就会发现很多的^@。我曾经尝试过很多方法,都没办法真正的rotate原始的truss.out。

 

    解决办法也很简单,那就是不要用-o 选项去指定输出文件,而是用重定向(redirect),但是你如果直接用

truss -dDeal -t 'lwp_park' -f -p $PID > truss.out

    你会发现输出仍然在屏幕,查一下你就知道,truss的输出是到标准错误输出

 

truss -dDeal -t '!lwp_park' -f  -p $PID >> truss.out 2>&1  &

    这样就可以了,你可以对输出文件作任何操作了。

 

    相同的还有time 命令

 

 

time truss -dDeal -t '!lwp_park' -f $command >> truss.out 2>&1 &
 

 

   这样可以记录整个命令的执行时间。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值