国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

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

發布時間:2015-12-4 15:37    發布者:designapp
關鍵詞: C語言 , ASSERT調試
C語言中的ASSERT(斷言)宏是嵌入式軟件開發人員可以使用的最好的調試工具之一。雖然ASSERT功能強大,但我很少看到它被實施,并且在一些使用它的案例中,它的實施要么是有瑕疵的要么是不正確的。以下一些技巧將不僅能夠幫助闡明在何時、何地使用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:將斷言用作可執行代碼注釋

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

小結

斷言是一種出色的工具,但有太多的嵌入式軟件開發人員忽視了這一工具。本文討論的八個技巧只是如何正確使用斷言的冰山一角。接下來讀者就可以在測試平臺中建立和開始使用斷言,并研究它們在實際的嵌入式系統中是如何工作的。
本文地址:http://m.qingdxww.cn/thread-158624-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品午夜国产va久久 | 国产性感美女视频 | 九色愉拍自拍 | 国产一级片在线 | 天堂网在线观看在线观看精品 | 激情亚洲天堂 | 亚洲色图视频在线 | 国产在线精品香蕉麻豆 | 青青草97国产精品免费观看 | 亚洲成人影院在线 | 亚洲色吧 | 欧美一级高清免费a | 男人天堂网2022 | 天堂资源wwww在线看 | 偷拍同志老头小便oldman | 蝴蝶传媒4.754 | 午夜免费观看福利片一区二区三区 | 欧美精品手机在线 | 亚洲欧美日韩在线观看播放 | 美女天天射 | 精品91自产拍在线观看一区 | 日本jjzz | 欧美成人精品一区二区三区 | 亚洲 另类 在线 欧美 制服 | 久草视频官网 | 色一情一伦一区二区三 | 日韩一级一欧美一级国产 | 日本免费a视频 | 四虎国产精品永久在线看 | 国产91在线看 | 高清成年美女黄网站色大 | 中国一级毛片在线观看 | 成人黄色免费在线观看 | 香蕉在线精品视频在线观看2 | 国产精品三| 在线97| 日韩大片 | 五月天精品在线 | 99这里只有精品在线 | 国产成人免费不卡在线观看 | 中文在线最新版天堂8 |