样本脚本
这里使用的是如下所示的脚本。这是在SystemTap中附属的sleeptime.stp样本脚本的基础上进行了一些修改而生成的。是用来测量在nanosleeptest程序中nanosleep()系统调用实际休眠了多少时间的脚本。
!/usr/bin/stap-v
/*
*Format is:
*TIMESTAMP PID(EXECNAME)MESSAGE
*/
global start
global entry_nanosleep
global entry_nanosleep_restart
function timestamp:long(){
return gettimeofday_us()-start
}
function proc:string(){
return sprintf("%d(%s)",pid(),execname())
}
probe begin{
start=gettimeofday_us()
}
probe syscall.nanosleep{
if(execname()!="nanosleeptest")next;
t=gettimeofday_us();p=pid()
entry_nanosleep[p]=t
}
probe syscall.nanosleep.return{
if(execname()!="nanosleeptest")next;
t=gettimeofday_us();p=pid()
elapsed_time=t-entry_nanosleep[p]
printf("%d%s nanosleep:%d\n",timestamp(),proc(),elapsed_time)
delete entry_nanosleep[p]
}
probe kernel.statement("hrtimer_nanosleep@kernel/hrtimer.c:1599"){
if(execname()!="nanosleeptest")next;
printf("%d%s nanosleep is interrupted.\n",timestamp(),proc());
p=pid();
entry_nanosleep_restart[p]=entry_nanosleep[p];
}
probe kernel.function("hrtimer_nanosleep_restart").return{
if(execname()!="nanosleeptest")next;
t=gettimeofday_us();p=pid()
elapsed_time=t-entry_nanosleep_restart[p]
printf("%d%s nanosleep_restart:%d\n",timestamp(),proc(),elapsed_time)
delete entry_nanosleep_restart[p];
}
追踪对象程序使用的是如下所示的nanosleeptest.c。
include<time.h>
int main(int argc, char*argv[])
{
struct timespec ts={0,0};
if(argc!=2)
return 0;
ts.tv_sec=strtol(argv[1],NULL,0);
return nanosleep(&ts, NULL);
}