當前位置:學問谷 >

生活範例 >科普知識 >

在C語言中用ASSERT調試的八個技巧

在C語言中用ASSERT調試的八個技巧

C語言中的ASSERT(斷言)宏是嵌入式軟件開發人員可以使用的最好的調試工具之一。面小編給大家介紹在C語言中用ASSERT調試的八個技巧,歡迎閲讀!

在C語言中用ASSERT調試的八個技巧

  在C語言中用ASSERT調試的八個技巧

 技巧1:記住ASSERT的定義

對許多開發人員來説,斷言是一個令人困惑的話題,因為它們的許多使用方式與其設計初衷背道而馳。我見到的最清晰的斷言定義是這樣的:

“斷言是在程序某個特定點的一個布爾表達式,除非程序中有缺陷(Bug),否則它的值將為真。”

想要理解上述斷言定義的開發人員應該留意下面三個要點:

·斷言會評估一個表達式是真還是假

·斷言是在代碼中的某個點對系統狀態的一種假設

·斷言會驗證系統假設,如果不為真,就表明代碼中有一個缺陷

技巧2:使用ASSERT驗證函數的先決條件

斷言非常適合契約式設計環境,在這種環境中,開發人員非常清晰地定義了某個函數的先決條件。斷言可以用來檢查該函數的輸入是否滿足先決條件。就拿圖1所示的代碼片段為例:

圖1:函數的先決條件

函數的State輸入應該在定義的系統狀態範圍內。如果State不是有效的狀態值,那麼它就不是錯誤,而是缺陷!斷言可以用來驗證State是有效的假設,如圖2所示:

圖2:對函數先決條件應用斷言

在State不小於最大值的事件中,斷言表達式將被評估為假,程序於是將停止執行。停止程序執行可以讓開發人員很容易馬上看到哪裏的代碼出錯,而不是過段時間以後才知道。

 技巧3:使用ASSERT驗證函數的後置條件

斷言也能用來驗證契約式設計環境中對某個函數輸出的假設。例如,如果前面定義的System_StateSet函數返回SystemState變量,開發人員可以預計它也在期望的範圍之內。斷言可以用來對缺陷進行監視,如圖3所示。

圖3:對函數後置條件應用斷言

開發人員在查看上述代碼後可能會感到這些檢查毫無意義。剛剛才設置好的SystemState怎麼就會出現大於SYSTEM_STATE_MAX的值呢?答 案是這確實不應該出現,然而有時候會莫名其妙地發生改變,也許是通過中斷或並行線程,此時斷言可以立即標誌出這個缺陷。

  技巧4:不要把ASSERT用於錯誤處理

在記住斷言定義之後,開發人員應該切記:斷言是用於檢測缺陷的,不能用於錯誤處理。錯誤處理是設計用於響應錯誤的用户輸入和意外的事件順序的軟件。錯誤在系 統中預料是會發生的,但僅僅是因為有無效的輸入而並不意味着代碼中有缺陷。錯誤處理應該與缺陷尋找分開來。錯誤使用斷言的一個典型例子是,在試圖打開一個 文件用於讀取時去檢查文件的指針,如圖4所示。

圖4:ASSERT的不當使用

讀者可以清楚地看到,試圖打開文件的結果與文件系統的狀態和用户數據有關,而與代碼中的缺陷一點關係也沒有。開發人員應該編寫錯誤處理程序,而不是用斷言,以便在文件不存在時,錯誤處理程序可以用一些默認可用數據來創建它,以便後續代碼繼續操作。

 技巧5:ASSERT僅對開發有意義,不能用於生產

開發ASSERT宏的'原始意圖是在開發過程中啟用它,在後面生產時要禁用。可以用NDEBUG宏激活和禁用ASSERT。正確實施的斷言在被禁用後應該對嵌入式系統基本沒有影響。

問題是,如果測試是在斷言啟用的情況下進行的(為了捕捉任何缺陷,應該這樣做),那麼現在禁用斷言將導致交付的產品與測試的產品處於不同的狀態。斷言確實會 佔用一些代碼空間,但更重要的是,它們需要佔用少量的時鐘週期來評估它們的布爾表達式。禁用ASSERT可能對具有有限資源的裸機系統的執行時序產生很大 影響,從而導致在生產系統中產生新的缺陷。開發團隊需要判斷是否值得冒關閉斷言的風險。

一種替代方案是保留斷言在激活狀態,而將它們的輸出重定向到一個系統日誌。這樣可以確保任何揮之不去的缺陷很容易被識別,而且能避免中止系統的運行,而中止系統可不是明智之舉。

 技巧6:不允許斷言有副作用

ASSERT 的默認實現允許開發人員包含一段可執行代碼作為布爾表達式的一部分。舉例來説,一個狀態變量可以被實現為表達式的一部分並傳遞給ASSERT。但如果傳遞 給ASSERT的表達式有副作用,也就是説,它會改變嵌入式系統的狀態,那麼禁用斷言將改變系統的行為。開發人員應該確保他們的表達式沒有副作用,否則他 們需要冒險在系統中增加只針對產品代碼喚醒的休眠時間缺陷。

技巧7:斷言應該佔代碼的1%至3%

每 個開發人員對於代碼庫(Code Base)中應該有多少個斷言都有自己的主見。大家一致同意的一個數字是,代碼庫中的斷言佔比應該大於0。斷言為開發人員提供了一種在代碼庫中發生缺陷的 時刻發現它的好方法。調試是在開發嵌入式系統中最浪費時間並令人沮喪的事情之一。不管開發人員認可的佔比是1%、3%還是5%,使用斷言肯定對你有利,並 會使開發嵌入式軟件變得多少有些趣味。

 技巧8:將斷言用作可執行代碼註釋

斷言可以生成極好的註釋!編寫出色的表達式可以確切地告訴開發人員在代碼的某個給定點應該預料發生什麼事情。開發人員應該做好他們斷言的架構,幫助人們更清楚地理解系統中發生的事情,進而幫助減少缺陷。

  • 文章版權屬於文章作者所有,轉載請註明 https://xuewengu.com/flsh/kepu/6yvd43.html