尝试执行

执行脚本的命令为stap。默认只显示脚本的执行结果,因此不知道脚本的生成和编译是何时进行的。要得知脚本的执行是何时开始的,需要尽量添加verbose选项(-v)并执行命令。


stap-v sleeptime.stp

Pass 1:parsed user script and 76 library script(s)using 22624virt/13468res/2432shr kb, in 350usr/40sys/409real ms.

Pass 2:analyzed script:5 probe(s),7 function(s),23 embed(s),3 global(s)using 209844virt/58080res/3404shr kb, in 1650usr/1640sys/4818real ms.

Pass 3:translated to C into"/tmp/stapX8Wjed/stap_cf3acae223ba1d1359216122bbc07 f5e_15503.c"using 209564virt/61080res/6520shr kb, in 1340usr/40sys/1418real ms.Pass 4:compiled C into"stap_cf3acae223ba1d1359216122bbc07f5e_15503.ko"in 4380usr/740sys/5823real ms.

Pass 5:starting run.


如果显示上述信息,则表示probe已启用。从其他终端使用测试账号执行nanosleep(),休眠10秒钟。


$nanosleeptest 10


这样就会在执行了stap命令的终端上显示下列信息。


51245488 1296(nanosleeptest)nanosleep:10000180


信息显示格式如下。显示的时间差都是以微秒为单位。


从启用probe开始的时间差PID(命令名称)nanosleep:实际经过时间


可能是因为本次是在虚拟环境下运行的,所以可以看出延迟达到180微秒。

接下来确认在刻意使用信号中断时是怎样的情况。与之前一样使用nanosleeptest程序休眠10秒钟。但是,中途发送SIGSTOP,中断nanosleep(),这样等待大约10多秒再发送SIGCONT信号。


79008508 3016(nanosleeptest)nanosleep is interrupted.

79008521 3016(nanosleeptest)nanosleep:5943297

85588697 3016(nanosleeptest)nanosleep_restart:12523472


输出了表示nanosleep()已中断的信息。从第2个信息可以看出,执行nanosleep()后约5.9秒后接收了SIGSTOP信号。从第3个信息可以看出,重新开始执行的nanosleeptest从nanosleep()恢复花费了约12.5秒。

确认完成后,可以按Ctrl+C快捷键结束SystemTap。SystemTap在结束时会自动将追踪用的内核模块从内核中移除。