ProbeVue簡介
BradCobb,AIXCollaborationCenter高級技術顧問,IBM
2008年11月06日
即使對於老練的程式設計師和系統管理員,應用程式開發和故障排除也是艱難的任務。即使有了最好的調試器,程式設計師有時候仍然希望用簡單的列印語句檢查應用程式正在執行的操作。IBM®AIX®V6增加了一種新的調試工具,ProbeVue。本文簡要介紹ProbeVue的用法以及相關聯的編程和腳本語言,並通過一個簡單的示例程式演示ProbeVue的用途和潛在價值。
簡介
ProbeVue這種跟蹤工具使用戶可以動態地跟蹤正在運行的程式。ProbeVue的主要接口是VUE語言。VUE既是程式語言,也是腳本語言。VUE語言與C語言和AIX可用的腳本語言相似。
VUE語法
ProbeVue腳本的基本形式與結構良好的C程式和awk腳本相似。VUE腳本檔案的一般形式如下:Variabledefinitions
Begin{
}
Probeclauses
End{
}
變數部分
在變數部分中定義全局變數。與C語言一樣,可以在檔案中的其它地方指定臨時變數。VUE支持以下變數類型:
C-89數據類型(包括有符號和無符號)short、int、long、longlong、float和double。對於浮點變數的操作只限於簡單的賦值表達式和作為VUE函式的變數。
String數據類型代表字元串字面值。例如,StringfooString[20]聲明一個長度為20的字元串字面值。只需用fooString=“MyString”初始化fooString。可以使用+操作符連線多個字元串字面值。
List數據類型表示一組整數類型的值。例如,fooList=list()創建ListfooList。使用append函式在fooList中添加值:append(fooList,value),其中的value可以是另一個列表或整數變數。除了append函式之外,List數據類型還支持avg()函式(計算列表的平均值)、min()函式(判斷列表中的最小值)、max()函式(判斷列表中的最大值)和count()函式(返回列表的大小,即列表中的條目數量)。
probev_timestamp_t是一種特殊的數據類型,用來從VUE時間戳函式返回值。返回的值採用AIX內部格式。
環境變數
在環境變數名稱前面加上$(美元)符號,就可以在VUE腳本中使用環境變數。在默認情況下,環境變數存儲整數值。要想保證傳遞字元串,環境變數必須用雙引號定義變數:exportMYENV=\”123\”傳遞字元串123,而exportMYENV=123傳遞整數值一百二十三。
除了傳遞環境變數之外,VUE還支持幾個內置的環境變數:
__CPID是ProbeVue命令創建的子進程的進程ID。
__CPTID是執行緒ID。
Begin部分
begin部分是VUE腳本中用來執行變數初始化的部分。在腳本開始執行時調用這個部分,而且只執行一次。
探測子句(Probeclauses)
探測子句部分包含程式邏輯。程式設計師在這個部分中定義各個探測點。下一節詳細討論各種探測類型,這些探測類型包括系統調用、用戶函式和內部。
探測類型
Probevue提供以下探測類型:
系統調用探測
用戶函式探測
內部探測
系統調用探測
系統調用探測(即syscall探測)用來探測libc庫和核心中的函式。可以為函式調用的進入或退出定義探測。系統調用探測的一般形式如下:
@@syscall:::
其中:
是要探測的進程(例如,123675或表示所有進程的*)
是要探測的系統調用(例如,read)
對函式調用的進入執行探測
對函式調用的退出執行探測
通過使用系統調用探測,可以在VUE腳本中使用輸入參數和返回值。為了訪問輸入參數,VUE腳本必須聲明要探測的函式的函式原型。例如:intread(intfd,char*buf,unsignedlongsize);
指定這一行,VUE腳本就能夠訪問fd、buf和size參數。使用一個特殊的內置變數__arg3捕捉函式的返回值。
用戶函式探測
用戶函式探測套用於應用程式代碼級探測。用戶函式探測的一般形式如下:@@uft::*::entry
其中:
process_ID是要探測的可執行程式的進程ID
function_name是要探測其進入的用戶函式
與系統調用探測不同,用戶函式探測必須指定一個進程ID,而且只能探測函式的進入。
內部探測
內部探測是以一定的時間間隔執行的探測。內部探測的一般形式如下:@@interval:*:clock:
其中以100ms為單位定義時間間隔。
命令語法
ProbeVue命令行提供各種選項。本文主要關注ProbeVue命令的以下形式。後面的ProbeVue示例腳本也使用這種形式。probevue[-XProgram_name[-A"Arguments_to_program"]]
[Script_name[Arguments_to_script]]
其中:-X啟動一個程式並在啟動程式之前啟用探測。
-A為使用-X標誌指定的程式指定參數。
Script_name包含要運行的ProbeVue腳本的檔案。
指定–X選項,這會在指定的命令執行期間運行ProbeVue。ProbeVue的這種用法有助於探測單一程式。
系統調用探測示例
前面已經簡要解釋了腳本語法和探測類型,現在來看一個使用系統調用探測的簡單ProbeVue腳本。
清單1:系統調用ProbeVue腳本示例
/*Functionprototypeforreadinordertoaccessinputargs*/
intread(intfd,char*buf,unsignedlongsize);
StringsFormat0[10];
StringsFormat1[10];
StringsLen[2];
@@BEGIN
{
/*Initializeprintfformatstrings*/
sLen="9";
sFormat0="%"+sLen+"d,";
sFormat1="%"+sLen+"d,"+"%"+sLen+"d\n";
sFormat2="%"+sLen+"s,%"+sLen+"s,%"+sLen+"s\n";
/*Printheader*/
printf(sFormat2,"Requested","Actual","Average");
/*Createlisttomaintainrollingaverage*/
rollingAvg=list();
}
/*Probetoprintthesizeofthereadbuffer.*/
@@syscall:*:read:entry
/*Onlyforthecurrentlyexecutingprogram.*/
when($__CPID==__pid){
/*__arg3representsthesizeofthereadbuffer.*/
printf(sFormat0,__arg3);
}
/*Probetoprinttheactualnumberofbytesreadi.e.thereturnvaluefromread.*/
@@syscall:*:read:exit
/*Onlyforthecurrentlyexecutingprogram.*/
when($__CPID==__pid){
/*Appendreturnvalue(__rv)tolist*/
append(rollingAvg,__rv);
printf(sFormat1,__rv,avg(rollingAvg));
}
@@END
{
}
顯示數據
這個系統調用ProbeVue腳本示例的輸出採用Microsoft®Excel®CSV(逗號分隔的值)格式。收集和格式化數據的方式數不勝數,但這個簡單的腳本和格式可以獲取應用程式的信息,在以前,這需要通過應用程式中的特定代碼來實現。通過使用ProbeVue,在應用程式之外執行這個腳本的代碼。下面是這個程式的輸出示例:probevue-X/usr/bin/tar-A"-cf/dev/null/scratch/bcobb/probevue"./p2.e|teet.csv
使用這個輸出創建一個如下圖所示的圖表。
清單1系統調用ProbeVue腳本產生的圖表
結束語
本文從程式設計師的角度簡要介紹了AIX工具集中的ProbeVue。本文討論了ProbeVue的基本概念,包括ProbeVue腳本的一般形式、VUE程式語言和一個簡單但有意義的示例腳本。
學習
您可以參閱本文在developerWorks全球站點上的英文原文。
IBMAIXInformationCenterforAIX6.1documentation提供關於AIX的技術信息。
訪問ProbevueWiki。
閱讀ProbeVue:ExtendedUsersGuideSpecification。
AIXandUNIX專區:developerWorks的“AIXandUNIX專區”提供了大量與AIX系統管理的所有方面相關的信息,您可以利用它們來擴展自己的UNIX技能。
AIXandUNIX新手入門:訪問“AIXandUNIX新手入門”頁面可了解更多關於AIX和UNIX的內容。
AIXandUNIX專題匯總:AIXandUNIX專區已經為您推出了很多的技術專題,為您總結了很多熱門的知識點。我們在後面還會繼續推出很多相關的熱門專題給您,為了方便您的訪問,我們在這裡為您把本專區的所有專題進行匯總,讓您更方便的找到您需要的內容。
developerWorks技術活動和網路廣播:隨時關注developerWorks技術活動和網路廣播。
獲得產品和技術
下載IBM產品評估版並開始使用來自DB2®、Lotus®、Rational®、Tivoli®和WebSphere的應用程式開發工具和中間件產品。
討論
參與developerWorksblog並加入developerWorks社區。
參與AIX和UNIX論壇:
AIXForum
針對開發人員的AIXForum
ClusterSystemsManagement
IBMSupportAssistantForum
PerformanceToolsForum
VirtualizationForum
更多AIX和UNIX論壇