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中的數組真是和哈希表一樣!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章