今天推荐的文章讲述的是作者的操作系统莫名其妙地出现很多的系统调用,最后查出的原因是一台打印机引起的。作者利用DTrace
一步一步debug
的过程很值得我们学习和借鉴。另外,我从这篇文章中也学到了很多好用的英语短语,像“roll with the punches
”,“flex muscles
”等等。总之,建议大家有时间可以看看,相信会有所收获的。
DTraceToolkit脚本解析(10)-modcalls.d
modcalls.d
位于DTraceToolkit的Kernel
文件夹下,其功能是统计不同模块调用kernel
函数的次数。脚本代码就一行(略去版权信息):
fbt:::entry { @calls[probemod] = count(); }
脚本代码分析如下:
监听fbt Provider
的 entry probe
(fbt Provider
几乎提供了对所有kernel
函数的entry
和exit
的trace
)。定义calls
这个aggregation
,用probemod
做key
(probemod
记录了当前probe
的模块名)。当probe
触发后,把calls
里相应模块的统计次数加[……]
DTraceToolkit脚本解析(9)-syscallbyproc.d
syscallbyproc.d
位于DTraceToolkit的Proc
文件夹下,其功能是统计进程使用系统调用的次数。脚本代码就一行(略去版权信息):
syscall:::entry { @num[execname] = count(); }
脚本代码分析如下:
监听syscall Provider
的 entry probe
,execname
内置变量记录了进程名,作为num
这个aggregation
的key
。当probe
触发后,把num
里相应进程的统计次数加1
。
执行脚本,输出如下:
Nans-MacBook-Pro:Proc root# ./syscallbyproc.d[......]
从哪里获得DTrace的源码包?
昨天看到Adam
发的推特:“hoping for DTrace in the next Red Star OS update!
”,我就在想:如果想把DTrace
移植到一个新的操作系统上,从哪里获得DTrace
的源码包呢?现在Mac OS X
,FreeBSD
都有DTrace
了,难道从这些系统上fork
出来DTrace
的代码?
我发了一封邮件给社区,很快就收到了Robert Mustacchi
的回复:从illumos
代码库(https://github.com/illumos/illumos-gate)可以得到所有DTrace
的代码(包含一些增强的功能),此外DTrace
是遵守CDDL
协议的。
[……]
DTraceToolkit脚本解析(8)-creatbyproc.d
creatbyproc.d
位于DTraceToolkit的Proc
文件夹下,其功能是打印调用creat
系统调用的进程名和创建的文件名。脚本代码就一行(略去版权信息):
syscall::creat*:entry { printf("%s %s", execname, copyinstr(arg0)); }
脚本代码分析如下:
监听creat
(或者creat64
)系统调用的 entry probe
,其中arg0
参数记录了要创建的文件名。当probe
触发后,打印进程名和创建的文件名。
执行脚本,输出如下:
bash-3.2# ./creatbyproc.d
dtrace:[......]