样本脚本

这里使用的是如下所示的脚本。这是在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);

}