新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式軟件設(shè)計(jì)中查找缺陷的幾個(gè)技巧

        嵌入式軟件設(shè)計(jì)中查找缺陷的幾個(gè)技巧

        作者: 時(shí)間:2008-04-06 來(lái)源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/258085.htm 有時(shí)候,采用堆棧深度分析過(guò)程可能是無(wú)法做到,或者是不實(shí)際的。如果無(wú)法得到運(yùn)行時(shí)庫(kù)或C庫(kù)的源代碼,而編譯器廠商又沒(méi)有提供任何堆棧使用信息,就不可能進(jìn)行完整的堆棧分析。在這種情況下,有兩種選擇:

          1. 在測(cè)試期間,觀察堆棧所能達(dá)到的深度,并保證有較大的堆棧空間余量。

          2. 檢測(cè)堆棧溢出,并采取改進(jìn)措施。

          觀察堆棧深度的方法很簡(jiǎn)單:

          * 向整個(gè)內(nèi)存堆棧區(qū)寫入一個(gè)特定的數(shù)據(jù)圖案符號(hào),如55AA。
          * 在預(yù)期使用最大堆棧空間的條件下運(yùn)行系統(tǒng)。
          * 使用仿真器或其它工具檢查堆棧存儲(chǔ)區(qū),看有多少符號(hào)圖案由于堆棧的使用而被改寫了。

          當(dāng)然,這些步驟并不能保證在一些不同條件下不會(huì)需要更多的堆棧,但確實(shí)可以表明所需要的最小堆棧數(shù)。

          使用帶內(nèi)存管理單元(MMU)的處理器時(shí),有可能檢測(cè)出運(yùn)行時(shí)的堆棧溢出現(xiàn)象。MMU將內(nèi)存劃分為多個(gè)區(qū)域,用一個(gè)受保護(hù)的內(nèi)存段來(lái)“警戒”堆棧區(qū)域。發(fā)生堆棧溢出時(shí),處理器將訪問(wèn)這個(gè)受保護(hù)段。這個(gè)操作將引發(fā)一個(gè)異常事件(如產(chǎn)生SIGSEGV信號(hào)),可被程序捕獲到。創(chuàng)建線程時(shí),與實(shí)時(shí)POSIX標(biāo)準(zhǔn)兼容的RTOS提供有這種堆棧警戒功能選項(xiàng),大大簡(jiǎn)化了編程人員的工作。GNU工具等其它開(kāi)發(fā)環(huán)境包含有編譯器開(kāi)關(guān),可在程序中添加實(shí)現(xiàn)堆棧警戒功能所需的代碼,但它們?nèi)匀灰揽康讓硬僮飨到y(tǒng)來(lái)有效地處理堆棧溢出。但是,按照這種方式檢測(cè)溢出還只是問(wèn)題的一部分。為了使這類設(shè)計(jì)更為有效,系統(tǒng)必須能夠從堆棧溢出中恢復(fù)過(guò)來(lái)并繼續(xù)正確地工作。

          在一個(gè)對(duì)安全或任務(wù)要求嚴(yán)格的應(yīng)用中,系統(tǒng)運(yùn)行時(shí)在測(cè)試或檢測(cè)堆棧溢出期間監(jiān)視堆棧的深度可能并不是一項(xiàng)足夠的風(fēng)險(xiǎn)控制措施。對(duì)于一些應(yīng)用,必須確保系統(tǒng)絕對(duì)不會(huì)越出所分配的堆棧范圍;只有通過(guò)完整的堆棧深度分析才能證明這一點(diǎn)。這意味著,如果整個(gè)程序在同一內(nèi)存空間運(yùn)行,則必須對(duì)所有代碼執(zhí)行這項(xiàng)分析。不過(guò),如果使用MMU,分析常可簡(jiǎn)化。在設(shè)計(jì)系統(tǒng)時(shí),可將所有關(guān)鍵代碼置于一個(gè)或多個(gè)獨(dú)立線程內(nèi),而這些線程分別在各自的保護(hù)內(nèi)存段中運(yùn)行。這樣,只要對(duì)這些關(guān)鍵線程進(jìn)行堆棧使用分析就可以了。當(dāng)然,這項(xiàng)簡(jiǎn)化設(shè)計(jì)假定當(dāng)非關(guān)鍵線程溢出其堆棧并失效時(shí),關(guān)鍵線程仍可正確執(zhí)行。

          由于分析工作所需的堆棧使用數(shù)據(jù)來(lái)自匯編語(yǔ)言清單,因此修改代碼時(shí),相應(yīng)模塊的堆棧使用信息必須予以更新。如果使用不同的編譯器版本,或者改變了優(yōu)化設(shè)置,也必須復(fù)核整個(gè)分析過(guò)程。在理想情況下,編譯器將提供每個(gè)函數(shù)(如果不是每個(gè)線程的話)的堆棧使用數(shù)量,因?yàn)樗鼡碛杏?jì)算需要的所有信息。例如,瑞薩公司提供有Call Walker,這是該公司高性能的Embedded Workshop開(kāi)發(fā)環(huán)境的一部分。這個(gè)工具可以圖形化地顯示每個(gè)函數(shù)使用的調(diào)用樹(shù)和堆棧,包括運(yùn)行時(shí)庫(kù)和C庫(kù)的函數(shù)。Call Walker也能找出使用堆棧數(shù)量最大的路徑。使用這樣的工具可以實(shí)現(xiàn)步驟1到步驟3的自動(dòng)化。

          大部分項(xiàng)目依靠結(jié)合代碼檢查、結(jié)構(gòu)測(cè)試和功能測(cè)試來(lái)識(shí)別軟件缺陷。盡管這些傳統(tǒng)技術(shù)非常重要,而且能發(fā)現(xiàn)大多數(shù)軟件問(wèn)題,但它們無(wú)法檢查出當(dāng)今復(fù)雜系統(tǒng)中的許多共性錯(cuò)誤。本文將介紹如何避免那些隱蔽然而常見(jiàn)的錯(cuò)誤,并介紹的幾個(gè)技巧幫助工程師發(fā)現(xiàn)軟件中隱藏的錯(cuò)誤。

          二、競(jìng)爭(zhēng)條件

          當(dāng)兩個(gè)或更多獨(dú)立線程同時(shí)訪問(wèn)同一資源時(shí),就出現(xiàn)了競(jìng)爭(zhēng)條件。競(jìng)爭(zhēng)條件的影響多種多樣,取決于具體的情況。清單1解釋了一個(gè)潛在的競(jìng)爭(zhēng)條件。函數(shù)Update_Sensor()通過(guò)調(diào)用get_raw()來(lái)讀取傳感器的原始數(shù)據(jù)。在處理過(guò)程中,該數(shù)據(jù)被乘上一個(gè)定標(biāo)因子,并加上一個(gè)偏移量。處理是在該數(shù)據(jù)的一個(gè)臨時(shí)副本上進(jìn)行的,然后,該臨時(shí)副本被寫入共享變量。


        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 石门县| 南澳县| 通河县| 苍梧县| 鸡泽县| 贵阳市| 兴文县| 易门县| 南充市| 浦城县| 滨海县| 左云县| 甘肃省| 崇仁县| 邢台市| 长沙市| 股票| 原阳县| 柞水县| 沂水县| 南岸区| 昭苏县| 宁德市| 南漳县| 贺州市| 邯郸县| 林口县| 新干县| 广东省| 兰州市| 新龙县| 大英县| 临桂县| 黄冈市| 鸡西市| 怀安县| 凤庆县| 祁阳县| 克什克腾旗| 濉溪县| 鸡泽县|