2013年8月17日星期六

SystemTap----初始化和遍历数组

   SystemTap数组中的索引项可以是long或者string类型(systemtap的基本类型),访问数组项的方式和C语言类似,数组名[索引]。例如odds[x],odds是数组名,x是索引。SystemTap中的数组必须声明为全局变量,不能是局部变量。
下面的示例是以long为索引项,如下所示:
global odds
probe begin {
printf("probe begin\n");

for (i = 0; i < 10; ++i) {
odds[i] = i;
}

exit();
}

probe end {
for (i = 0; i < 10; ++i) {
printf("odds[%d] = %d\n", i, odds[i]);
}

printf("probe end\n");
}
熟悉C语言的同学看到这个脚本是不是很熟悉!脚本在开始的位置定义了一个全局变量odds,我们在这里将odds作为数组使用,索引项是整数,使用的是for循环。
除了for循环的遍历方式外,还可以使用foreach循环,如果使用过面向对象语言的话,对foreach也不会陌生,非常方便的一种遍历方式,使用起来也非常简单,实例如下:

global odds
probe begin {
printf("probe begin\n");

for (i = 0; i < 10; ++i) {
odds[i] = i;
}

exit();
}

probe end {
foreach(i+ in odds) {
printf("odds[%d] = %d\n", i, odds[i]);
}

printf("probe end\n");
}
注意,使用foreach遍历数组的时候,获取的不是数组项,而是索引!细心的同学会发现在i的后面有一个“+”,这个表示的按照顺序进行遍历(默认情况也是如此,可以不加),即索引遍历顺序从0到9.这个“+”号还可以添加到odds后边。既然有顺序遍历,就有逆序遍历,只需要把“+”换成“-”,同样加在i后边或odds后边都可以。
如果是使用string类型做索引,则只能使用foreach来遍历了,遍历的方式和以long为索引一样。
systemtap虽然支持long和string类型做索引,但是单个数组的索引要么都是long类型,要么都是string类型,如果混合,则编译时会报错。数组项的值也一样,要么是long类型,要么是string类型。注意,这里说的是索引项或数组项的值要统一,但是索引项是long类型,数组项的值是string类型是可以的,反之亦可。
在测试的过程,还发现了一个有趣的地方,就是如果在probe begin块中初始化了数组,但是在probe end块中没有访问数组,则在脚本退出时,会自动顺序打印出数组,示例脚本和输出结果如下所示:
global odds
probe begin {
printf("probe begin\n");

for (i = 0; i < 10; ++i) {
odds[i] = "123";
}

exit();
}

probe end {
printf("probe end\n");
}
输出结果:
[root@CentOS_190 systemtap]# stap syst1.stp
probe begin
probe end
odds[0]="123"
odds[1]="123"
odds[2]="123"
odds[3]="123"
odds[4]="123"
odds[5]="123"
odds[6]="123"
odds[7]="123"
odds[8]="123"
odds[9]="123"
如果不想在退出的时候打印的话,可以在probe end块中加入下面的语句:
delete odds;
这条语句会清空数组中的元素。
update:
SystemTap中数组的索引项还是可以是由long和string类型混合,中间以","分割,示例如下:
global odds
probe begin {
printf("probe begin\n");
odds["789","Jack", 10] = 2;
odds["123","Tom", 11] = 3;

exit();
}

probe end {
foreach ([x,y,z] in odds) {
printf("odds[%s,%s,%d] = %d\n", x, y, z, odds[x,y,z]);
}
printf("End\n");
}
除了上述方式还,还可以使用下面的方式遍历,
probe end {
foreach (var=[x,y,z] in odds) {
printf("odds[%s,%s,%d] = %d\n", x, y, z, var);
}
printf("End\n");
}
SystemTap中的数组真是和哈希表一样!

没有评论:

发表评论