尝试执行
执行脚本的命令为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在结束时会自动将追踪用的内核模块从内核中移除。