表格 1. 可以與 Purify 選項一起使用的轉換符號
字符轉換到 %v 可執行程序名稱,小寫字母 V (您所運行的可測量的執行文件的名稱) %V 這個程序的完整路徑名稱,大寫字母 V(/被_所代替) %p 進程 ID(pid 或者 PID)
表格 2. 可以使用在 Exit-命令的轉換符號 (-run-at-exit)
字符轉換為 %z 字符串值true或者false,表示是否有任何錯誤或者滲漏的得鏈被打。ó Purify 找到一些您感興趣的事務,可以利用它使您的退出腳本有條件地執行) %x 項目的退出狀態(0如果這個程序沒有調用退出命令) %e 打印的明顯的訪問錯誤(顯示的) %E 打印出的所有錯誤的總數 %l 內存泄露字節的總數(小寫字母 L) %L 存儲潛在滲漏的字節總數(大寫字母 L)
利用這個程序退出狀態
您已經學習了如何在可測試程序運行的末尾運行您的腳本。Purify 還給了您們一些穿過它退出狀態的一些信息。默認情況下,Purify 是不會修改您程序的正常退出狀態的。然而,如果 Purify 發現任何訪問錯誤或者內存泄露,您可以利用一個具體的退出狀態來選擇使您的程序退出。這是一個減小測試單元中失敗運行的便利的方法。利用 -exit-status=yes 選項能夠使 Purify 插入表明運行時錯誤的標志。如果有一些大寫字母的 Purify 錯誤,這個狀態代碼可以通過操作下面值的 bit-wise OR 來處理,根據展現的存儲錯誤的類型:
0x40:存儲訪問錯誤 0x20:內存泄露 0x10:潛在內存泄露另一方面,您可以在您的代碼中將這些命令替代為退出(狀態),以及替換帶有purify_exit(status) 功能的 main() 中的為 返回陳述。(請看這篇文章中關于 Application Programming Interface 功能的參考資料。)如果您只關注這個存儲訪問錯誤,您要么可以通過使用 -leaks-at-exit=no選項在退出時關閉滲漏缺陷,要么可以抑制內存泄露和潛在滲漏消息。您還可以忽略退出狀態的適當的字節。然而,Purify 報告中的程序概要消息總是在任何其它 Purify 結果狀態進入它之前顯示您最初的退出狀態 。
列表 1是一個例子,它利用這個 -exit-status 選項并使用這個退出狀態來決定是否有錯誤在這個程序中被發現。
列表 1. 退出狀態選項的例子
$ cat prog.c #include <stdio.h> int main() { int i,j; i = j+1; /* UMR: Reading un-initialized variable j */ return 0; } $ purify -exit-status=yes cc -g prog.c -o prog.pure $ prog.pure $ echo $? 64
這個退出值不是 0(零),如 main 函數中所返回的。它是64,在十六進制中它是 0x40。這是因為 Purify 在這個程序中檢測到一個 Uninitialized Memory Read (UMR) 存儲訪問錯誤。這個選項可以簡單地合并到一個腳本中,這個腳本根據發現的錯誤核查運行的可執行文件和采取適當行為之后的退出狀態,比如利用這個測試程序填充一個缺陷報告,或者在這個 Purify 日志中 記錄結果。
如果您想要您的可測試應用軟件在檢測到第一個錯誤之上退出,您可以利用 -exit-on-error選項。當您使用這個選項的時候,這個程序退出的時候 Purify 遇到一個錯誤(通過使用 suppress 和 kill 指令進行隱藏的錯誤是不計算的)。
郵寄 Purify 結果以及協助分析
Purify 擁有一個-mail-to-user 選項,您可以用來自動報告每日或者每周的 Purify 結果。當您使用這個選項的時候,Purify 將通過電子郵件發送錯誤報告到測試人員和開發人員的具體地址中,當他們收到這個郵件時會驗證這個結果。例如,假設您用這種方法凈化您的程序:
$ purify -mail-to-user=yourid cc -g prog.c -o prog.pure當您運行這個 prog.pure 可執行文件之后,Purify 報告將自動發送到 yourid 郵件地址。
有時候,分析這個錯誤的時候,查看功能名稱和其它詳細情況是十分有用的,比如完成這個文件存儲的路徑或者 PC 值。您可以使 Purify 通過使用這些選項來展示這樣的信息:
-show-pc 向您顯示了完全的 PC 值 -show-pc-offset 向您顯示了從這個功能的開始的 pc 移位 -show-directory 顯示了括功能存在的地址列表 (需要有調試的程序構建)例子
在這部分中,您將看到一個使用了您在這篇文章中學到的絕大多數選項的例子。列表 2顯示了GNUMakefile,包括修改的構建和測試系統 (請看下載,從而獲取這篇文章所使用的源代碼)。如果這個應用軟件的名稱為 memerrors,那么構建 Purify 的應用軟件所附加的新目標的名稱就為 memerrors.pure。類似的,利用 Purify 的應用軟件可以添加的新目標。
Purify 運行時選項在運行這個測試前就設置好了。對于 -log-file 選項,只能創建一個日志文件名稱,利用轉換符號和日期命令 (這個文件名稱包括程序名稱,過程 ID,日期,以及時間)。這個 -run-at-exit 選項用來表明,這個程序退出之后,這個 addsummary.sh腳本就應該運行,憑借轉換符號伴隨著具體的變量(也就是說,這個日志文件名稱,無論是否有錯誤調令鏈被打印,退出狀態,存儲錯誤發現的數量,內存泄露的規模,以及潛在存儲泄漏)。由于這個 -exit-status=yes 選項沒有被使用。Purify 將不能覆蓋這個退出狀態和保持這個程序最初退出時的狀態。
列表 2. 附有修改過的構建和測試系統的 GNUMakefile
# Name of Logfile using Purify conversion symbols and date command DATEANDTIME := `date +%Y_%b_%d_%H_%M_%S` LOGFILENAME := %v_pid%p_$(DATEANDTIME).plog # Script to run when Purify'ed program exits PURIFYEXITSCRIPT:= \"addsummary.sh $(DATEANDTIME) $(LOGFILENAME) %z %x %e %l %L\" # Purify Options PURIFYOPTIONS := -log-file=$(LOGFILENAME) -run-at-exit=$(PURIFYEXITSCRIPT) # Targets and Rules all: runtest runpurifytest # Clean clean: $(RM) memerrors memerrors.pure # Build Application memerrors: memerrors.c $(CC) -o $@ $? # Build Purify'ed application memerrors.pure: memerrors.c purify $(CC) -g -o $@ $? # Run Test Suite runtest: memerrors ./memerrors # Run Test Suite with Purify'ed application runpurifytest: memerrors.pure echo Starting test at $(DATEANDTIME) ..... env PURIFYOPTIONS="$(PURIFYOPTIONS)" ./memerrors.pure # End of GNUMakefile
這個顯示在列表 3中的 addsummary.sh 腳本創建了一個 HTML 報告。它維護了一個到目前為止對每個 Purify 運行都有一個 HTML 表格行的文件列表,反之則是按照時間順序的。當這個腳本在現存的 Purify 之上執行時,它創建了一個包含最近每次運行的 HTML 表格行的新文件列表,附加先前行的文件,并用新文件列表取代了舊的列表。然后它通過包裝這個文件列表的 HTML 頭部和頁腳從而產生了一個 HTML 文件。
文章來源于領測軟件測試網 http://www.kjueaiud.com/