日韩高清亚洲日韩精品一区二区三区,成熟人妻av无码专区,国产又A又黄又潮娇喘视频,男女猛烈无遮挡免费视频在线观看

Get技能 – 嵌入式軟件測(cè)試的10條秘訣(嵌入式軟件測(cè)試教程)

在嵌入式軟件開(kāi)發(fā)過(guò)程中,花在測(cè)試和花在編碼的時(shí)間比通常在3:1左右(實(shí)際上可能更多)。這個(gè)比例會(huì)隨著工程師編程、測(cè)試水平的提高而不斷下降,但無(wú)論如何,軟件測(cè)試都是嵌入式軟件開(kāi)發(fā)中至關(guān)重要的部分。

多年前,一位工程師為了對(duì)嵌入式擁有更深層次理解的追求,曾發(fā)出這樣的疑問(wèn):“我怎么才能知道并懂得我的系統(tǒng)到底在干些什么呢?”。同時(shí)代的嵌入式開(kāi)發(fā)人員問(wèn)得最多的問(wèn)題大都圍繞“我怎么才能使程序跑得更快”、“什么編譯器最好”,這個(gè)問(wèn)題雖然不同尋常,但卻異乎成熟。今天就讓我們一起了解10條在業(yè)界廣為流傳的嵌入式開(kāi)發(fā)測(cè)試秘訣。

Get技能 - 嵌入式軟件測(cè)試的10條秘訣(嵌入式軟件測(cè)試教程)

一、懂得使用工具

嵌入式系統(tǒng)通常對(duì)可靠性要求較高,一旦發(fā)生安全問(wèn)題可能就會(huì)導(dǎo)致災(zāi)難性的后果,即使與安全無(wú)關(guān)也會(huì)帶來(lái)嚴(yán)重的經(jīng)濟(jì)損失,對(duì)嵌入式系統(tǒng)及軟件有著嚴(yán)格的測(cè)試、確認(rèn)和驗(yàn)證要求。隨著越來(lái)越多的領(lǐng)域的嵌入式設(shè)備開(kāi)始被軟件和微處理器控制,對(duì)日益復(fù)雜的嵌入式軟件進(jìn)行快速有效的測(cè)試顯得愈加重要。

好的修車(chē)匠需要好工具,好的程序員應(yīng)該能夠熟練運(yùn)用各種軟件工具。不同的工具有不同的使用范圍、功能。合適的工具可以讓工程師看到系統(tǒng)在干些什么,它又占用什么資源、到底和外界哪些東西打交道。工程師不應(yīng)該害怕加入測(cè)試工具或測(cè)試模塊到代碼需要的技巧或可能引入新的錯(cuò)誤,光靠不斷修改、重新編譯代碼來(lái)消除Bug是不夠的;也不應(yīng)該因習(xí)慣使用printf之類(lèi)的簡(jiǎn)單測(cè)試手段而不進(jìn)行新的學(xué)習(xí)和探索。下面是一些嵌入式常用的測(cè)試工具。

源碼級(jí)調(diào)試器【Source-levelDebugger】:此類(lèi)調(diào)試器一般提供單步或多步調(diào)試、斷點(diǎn)設(shè)置、內(nèi)存檢測(cè)、變量查看等功能,是嵌入式調(diào)試最基本的調(diào)試方法。

簡(jiǎn)單實(shí)用的打印顯示工具【printf】:printf及類(lèi)似的打印顯示工具估計(jì)是最靈活、最簡(jiǎn)單的調(diào)試工具。打印代碼執(zhí)行過(guò)程中的各種變量可以讓工程師獲知代碼執(zhí)行的情況,但printf對(duì)正常的代碼執(zhí)行干擾比較大(一般printf會(huì)占用CPU較長(zhǎng)時(shí)間),需要慎重使用,最好設(shè)置打印開(kāi)關(guān)來(lái)控制打印。

ICE或JTAG調(diào)試器【In- circuitEmulator】:ICE是用來(lái)仿真CPU核心的設(shè)備,可以在不干擾運(yùn)算器的正常運(yùn)行情況下,實(shí)時(shí)檢測(cè)CPU內(nèi)部工作情況,也能像桌面調(diào)試軟件一樣提供復(fù)雜的條件斷點(diǎn)、先進(jìn)的實(shí)時(shí)跟蹤、性能分析和端口分析等功能。ICE一般都有一個(gè)較為特殊的CPU,被稱(chēng)為外合(bond-out)CPU,是一種被打開(kāi)了封裝且通過(guò)特殊的連接可以訪問(wèn)CPU內(nèi)部信號(hào)的CPU,這些信號(hào)在CPU被封裝時(shí)是沒(méi)法被“看到”的。當(dāng)和工作站上強(qiáng)大的調(diào)試軟件聯(lián)合使用時(shí),ICE就能提供幾乎最全面的調(diào)試功能。然而ICE同樣有著昂貴、不能全速工作的缺點(diǎn);同樣,并不是所有的CPU都可以作為外合CPU的,從另一個(gè)角度說(shuō),這些外合CPU也不大可能及時(shí)被新出的CPU所更換。JTAG(Joint Test Action Group)最初開(kāi)發(fā)目的是監(jiān)測(cè)IC和電路連接,但其擴(kuò)展了包括調(diào)試支持在內(nèi)的用途。

ROM監(jiān)視器【ROMMonitor】:一款駐留在嵌入系統(tǒng)ROM中的小程序,通過(guò)串行或網(wǎng)絡(luò)連接和運(yùn)行在工作站上的調(diào)試軟件通信。這是最低端的技術(shù),相對(duì)便宜,除了要求一個(gè)通信端口和少量的內(nèi)存空間外,不需要其它任何專(zhuān)門(mén)的硬件,提供下載代碼、運(yùn)行控制、斷點(diǎn)、單步步進(jìn),以及觀察、修改寄存器和內(nèi)存等功能。由于ROM監(jiān)控器是操作軟件的一部分,所以如果想要檢查CPU和應(yīng)用程序的狀態(tài),必須先停下應(yīng)用程序,再次進(jìn)入ROM監(jiān)控器。

Data監(jiān)視器【DataMonitor】:在不停止CPU運(yùn)行的情況下不僅可以顯示指定變量?jī)?nèi)容,還可以收集并以圖形形式顯示各個(gè)變量的變化過(guò)程。

OS監(jiān)視器【Operating System Monitor】:操作系統(tǒng)監(jiān)視器可以顯示諸如任務(wù)切換、信號(hào)量收發(fā)、中斷等事件。這些監(jiān)視器能夠呈現(xiàn)事件之間的關(guān)系和時(shí)間聯(lián)系,還可以提供對(duì)信號(hào)量?jī)?yōu)先級(jí)反轉(zhuǎn)、死鎖和中斷延時(shí)等問(wèn)題的診斷。

性能分析工具【Profiler】:可以用來(lái)測(cè)試CPU消耗所在,了解系統(tǒng)瓶頸、CPU的使用率以及需要優(yōu)化之處。

內(nèi)存測(cè)試工具【MemoryTeseter】:可以找到內(nèi)存使用的問(wèn)題所在,比如內(nèi)存泄露、內(nèi)存碎片、內(nèi)存崩潰等問(wèn)題。如果發(fā)現(xiàn)系統(tǒng)出現(xiàn)不可預(yù)知或間歇性的問(wèn)題,就應(yīng)該使用內(nèi)存測(cè)試工具進(jìn)行嘗試。

運(yùn)行跟蹤器【ExecutionTracer】:可以顯示CPU執(zhí)行了哪些函數(shù)、誰(shuí)在調(diào)用、參數(shù)是什么、何時(shí)調(diào)用等情況,主要用于測(cè)試代碼邏輯,可在大量事件中發(fā)現(xiàn)異常。

覆蓋工具【CoverageTester】:主要顯示CPU具體執(zhí)行了哪些代碼,便于了解代碼分支未被執(zhí)行的區(qū)域,有助于提高代碼質(zhì)量并消除無(wú)用代碼。

GUI測(cè)試工具【GUITester】:大多嵌入式應(yīng)用都帶有某種特定形式的圖形用戶交互界面,部分系統(tǒng)的性能測(cè)試是根據(jù)用戶輸入響應(yīng)時(shí)間來(lái)進(jìn)行的。GUI測(cè)試工具可以作為開(kāi)發(fā)環(huán)境中運(yùn)行測(cè)試用例的腳本工具,其功能包括對(duì)操作的記錄和回放、抓取屏幕顯示供后續(xù)分析比較、設(shè)置和管理測(cè)試過(guò)程(Rational公司的robot和MercuryLoadrunner工具是之中的杰出代表)。沒(méi)有GUI的嵌入式設(shè)備可通過(guò)插裝來(lái)運(yùn)行GUI測(cè)試腳本,雖然需要更改被測(cè)代碼,但是節(jié)省了功能測(cè)試和回歸測(cè)試的時(shí)間。

嵌入式半實(shí)物仿真測(cè)試開(kāi)發(fā)環(huán)境【ETest】:是專(zhuān)門(mén)針對(duì)嵌入式系統(tǒng)進(jìn)行測(cè)試開(kāi)發(fā)的工具,系統(tǒng)提供圖形化的測(cè)試用例開(kāi)發(fā)環(huán)境,自動(dòng)生成測(cè)試腳本;測(cè)試結(jié)果數(shù)據(jù)可以在線監(jiān)控,同時(shí)生成測(cè)試結(jié)果信息,并自動(dòng)生成符合要求的測(cè)試報(bào)告;ETest為開(kāi)放性平臺(tái),提供C/C , Python, Lua ,JS等API,圖形化監(jiān)控軟件界面可以根據(jù)用戶需求定制;支持各種國(guó)產(chǎn)CPU 國(guó)產(chǎn)操作系統(tǒng)的部署方案。工程師可基于ETest為嵌入式設(shè)備快速構(gòu)建測(cè)控系統(tǒng),實(shí)現(xiàn)對(duì)被測(cè)件實(shí)時(shí)、動(dòng)態(tài)、閉環(huán)、非侵入式的自動(dòng)化測(cè)試。

二、盡早發(fā)現(xiàn)內(nèi)存問(wèn)題

內(nèi)存問(wèn)題存在較大危害且不容易排查,主要有三種類(lèi)型:內(nèi)存泄露、內(nèi)存碎片和內(nèi)存崩潰。對(duì)待內(nèi)存問(wèn)題必須要明確早發(fā)現(xiàn)、早“治療”的態(tài)度。

內(nèi)存泄漏

內(nèi)存泄露是軟件設(shè)計(jì)最常見(jiàn)的內(nèi)存難題,指由于不斷分配的內(nèi)存無(wú)法及時(shí)地被釋放,逐漸耗盡系統(tǒng)內(nèi)存。即使細(xì)心的編程老手也會(huì)遭遇內(nèi)存泄露問(wèn)題,因其一般隱藏很深,很難通過(guò)代碼閱讀發(fā)現(xiàn),甚至可能出現(xiàn)在庫(kù)當(dāng)中——有可能庫(kù)中本就有bug,也有可能是因?yàn)楣こ處煕](méi)有正確理解接口說(shuō)明文檔而造成了錯(cuò)用。

大多數(shù)的內(nèi)存泄露雖然無(wú)法探測(cè),但會(huì)表現(xiàn)為隨機(jī)的故障,往往會(huì)被認(rèn)為是硬件問(wèn)題。如果用戶對(duì)系統(tǒng)穩(wěn)定性要求較高,此類(lèi)問(wèn)題會(huì)導(dǎo)致客戶對(duì)產(chǎn)品失去信心,項(xiàng)目也會(huì)因此失敗??紤]到內(nèi)存泄漏的巨大危害,現(xiàn)在已有眾多解決工具,通過(guò)查找沒(méi)有被引用或重復(fù)使用的代碼塊、垃圾內(nèi)存收集、庫(kù)跟蹤等技術(shù)來(lái)發(fā)現(xiàn)內(nèi)存泄露,盡管每款工具都有利有弊,但還是應(yīng)防患于未然,盡量測(cè)試內(nèi)存泄漏。

內(nèi)存碎片

內(nèi)存碎片比內(nèi)存泄露有著更深的隱匿性。隨著內(nèi)存不斷被分配并釋放,大塊內(nèi)存被不斷分解為小塊內(nèi)存,從而形成碎片,后續(xù)需要申請(qǐng)大塊內(nèi)存時(shí)就有可能會(huì)失敗。系統(tǒng)內(nèi)存夠大或許可能可以堅(jiān)持較長(zhǎng)時(shí)間,但最終還是逃不出分配失敗的厄運(yùn)。在使用動(dòng)態(tài)分配的系統(tǒng)中,內(nèi)存碎片經(jīng)常發(fā)生。

該問(wèn)題當(dāng)前最為有效的方法便是使用工具,通過(guò)顯示系統(tǒng)內(nèi)存使用情況來(lái)找到內(nèi)存碎片的罪魁禍?zhǔn)撞⑦M(jìn)行改進(jìn)。很多公司為避免動(dòng)態(tài)內(nèi)存管理問(wèn)題,會(huì)選擇在嵌入式應(yīng)用中禁用malloc/free來(lái)以絕后患。

內(nèi)存崩潰

內(nèi)存崩潰是內(nèi)存使用最為嚴(yán)重的結(jié)果,主要造成原因有數(shù)組訪問(wèn)越界、指針計(jì)算錯(cuò)誤、重復(fù)釋放同一段內(nèi)存、釋放非動(dòng)態(tài)內(nèi)存等。此類(lèi)問(wèn)題發(fā)生通常是隨機(jī)的,極難事先排查,目前也很少有可供排查的工具。

綜上,使用內(nèi)存管理單元必須要小心謹(jǐn)慎,嚴(yán)格遵守其使用規(guī)則。

三、深入理解代碼優(yōu)化

人們對(duì)嵌入式系統(tǒng)的關(guān)注點(diǎn)通常在于實(shí)時(shí)性和速度,這兩個(gè)要素直接影響著代碼效率,需要對(duì)代碼進(jìn)行優(yōu)化。了解如何優(yōu)化代碼是每個(gè)嵌入式軟件開(kāi)發(fā)人員必須具備的技能,而優(yōu)化代碼的前提和必要條件則是找到真正需要優(yōu)化之處,然后再對(duì)癥下藥。

上文提到的profile能夠記錄如各任務(wù)CPU占用率、優(yōu)先級(jí)分配、數(shù)據(jù)拷貝次數(shù)、磁盤(pán)訪問(wèn)次數(shù)、是否調(diào)用網(wǎng)絡(luò)收發(fā)程序、測(cè)試代碼是否已經(jīng)關(guān)閉等數(shù)據(jù),但在分析實(shí)時(shí)系統(tǒng)性能方面仍有不足。一方面,profile的使用往往是在系統(tǒng)出現(xiàn)問(wèn)題,即CPU耗盡之后,而profile本身對(duì)CPU占用較大,所以很有可能不起作用。根據(jù)Heisenberg效應(yīng),任何測(cè)試手段或多或少都會(huì)改變系統(tǒng)運(yùn)行。

四、不要大海撈針

大海撈針是對(duì)調(diào)試的生動(dòng)比喻。尋找bug時(shí)應(yīng)先確實(shí)是否在開(kāi)發(fā)時(shí)有過(guò)為了尋求捷徑而沒(méi)有嚴(yán)格遵守編碼設(shè)計(jì)規(guī)范的情況,或是沒(méi)有檢測(cè)部分假設(shè)條件或算法的正確性、沒(méi)有將可能存在問(wèn)題的代碼打上記號(hào)。可參照《高質(zhì)量c /c編程指南》或《關(guān)于C的0x8本“經(jīng)書(shū)”》來(lái)學(xué)習(xí)。

為了盡可能地暴露和捕捉問(wèn)題根源,可以設(shè)計(jì)較為全面的錯(cuò)誤跟蹤代碼:盡可能處理每一個(gè)函數(shù)調(diào)用失敗,盡可能檢測(cè)每個(gè)參數(shù)輸入輸出的有效性,包括指針及是否過(guò)多或過(guò)少地調(diào)用某個(gè)過(guò)程。錯(cuò)誤跟蹤能夠了解bug的大概位置。

五、重視并隔離問(wèn)題

對(duì)于模塊獨(dú)立的大型項(xiàng)目,如果問(wèn)題的出現(xiàn)是間歇性的,則有必要設(shè)法去重現(xiàn)并進(jìn)行記錄完整過(guò)程,以備在下一次出現(xiàn)問(wèn)題是進(jìn)行復(fù)用。

確保問(wèn)題重現(xiàn)后可用隔離的方法來(lái)解決問(wèn)題:用#ifdef把一些可能和問(wèn)題無(wú)關(guān)的代碼關(guān)閉,把系統(tǒng)最小化到仍能夠重現(xiàn)問(wèn)題的地步。如果還是無(wú)法定位問(wèn)題所在,可以考慮打開(kāi)“工具箱”:試著用ICE或數(shù)據(jù)監(jiān)視器去查看某個(gè)可疑變量的變化;使用跟蹤工具獲得函數(shù)調(diào)用的情況(包括參數(shù)的傳遞);檢查內(nèi)存是否崩潰以及堆棧溢出的問(wèn)題。

六、以退為進(jìn)

獵人為了不使自己在森林里迷路常常會(huì)在樹(shù)木上留下標(biāo)記,對(duì)過(guò)去代碼修改進(jìn)行跟蹤記錄對(duì)將來(lái)出現(xiàn)問(wèn)題之后的調(diào)試也很有幫助。代碼控制系統(tǒng)SCS或代碼控制系統(tǒng)SCS可以很好地解決修改回溯問(wèn)題,將上個(gè)版本checkin下來(lái)后和當(dāng)前測(cè)試版本比較,可采用SCS/VCS/CVS自帶的diff工具或其他功能更強(qiáng)的比較工具,比如BeyondCompare和ExamDiff。通過(guò)比較、分析所有改動(dòng)代碼,可以得到所有可能導(dǎo)致問(wèn)題的可疑代碼的分析結(jié)果。

七、確定測(cè)試的完整性

覆蓋率測(cè)試可供確認(rèn)CPU到底執(zhí)行了哪些代碼,從而確認(rèn)測(cè)試的完整性。覆蓋率工具有不同的測(cè)試級(jí)別,用戶可以根據(jù)自己的需要選擇某個(gè)級(jí)別。

即使單元測(cè)試已經(jīng)很全面且沒(méi)有deadcode,覆蓋率工具還是可以指出一些潛在問(wèn)題。

以下方代碼為例:

if(i>=0&& (almostAlwaysZero==0 || (last=i)))

如果almostAlwaysZero為非0,那么last=i賦值語(yǔ)句就被跳過(guò),無(wú)法完成目標(biāo)。

此類(lèi)問(wèn)題可輕松通過(guò)覆蓋率工具的條件測(cè)試功能完成解決,覆蓋率測(cè)試工具對(duì)提高代碼質(zhì)量是很有幫助的。

八、提高代碼質(zhì)量意味著節(jié)省時(shí)間

有研究表明,超過(guò)80%的軟件開(kāi)發(fā)時(shí)間被用在下面幾個(gè)方面:調(diào)試自己的代碼(單元測(cè)試)、調(diào)試自己和其他相關(guān)的代碼(模塊間測(cè)試)、調(diào)試整個(gè)系統(tǒng)(系統(tǒng)測(cè)試),更糟糕的則是可能需要花費(fèi)10-200倍的時(shí)間來(lái)找一個(gè)最開(kāi)始時(shí)很容易就能發(fā)現(xiàn)的bug。

千里之堤毀于蟻穴,即使bug對(duì)整個(gè)系統(tǒng)的性能沒(méi)有太大的影響,但仍然很可能會(huì)影響可以被看得到的部分,必須養(yǎng)成良好的編碼習(xí)慣和測(cè)試手段,以求更高的代碼質(zhì)量,縮短代碼的調(diào)試。

九、發(fā)現(xiàn)它,分析它,解決它

世界沒(méi)有萬(wàn)能的膏藥,工具再好用也有無(wú)法實(shí)現(xiàn)之處,對(duì)于隱藏很深、用盡所有工具也無(wú)法查到其根源的問(wèn)題,則需要通過(guò)問(wèn)題的外在表現(xiàn)或數(shù)據(jù)輸出來(lái)尋找其中規(guī)律,從而找出異常。任何異常的發(fā)現(xiàn)都應(yīng)深入理解并回溯其根源。

十、請(qǐng)利用初學(xué)者思維

“有些事情在初學(xué)者的腦子里可能有各種各樣的情況,可在專(zhuān)家的頭腦里可能就很單一”,簡(jiǎn)單問(wèn)題想復(fù)雜、簡(jiǎn)單系統(tǒng)設(shè)計(jì)復(fù)雜很可能就是由于“專(zhuān)家思維”。被問(wèn)題難住時(shí),不妨換個(gè)思路,或許就能得到意想不到的啟發(fā)。

測(cè)試工具推薦

嵌入式調(diào)試無(wú)疑是一門(mén)藝術(shù),和其它藝術(shù)一樣,想要取得成功就必須具備智慧、經(jīng)驗(yàn)并懂得使用工具。嵌入式系統(tǒng)半實(shí)物仿真測(cè)試集成開(kāi)發(fā)環(huán)境ETest,是面向全過(guò)程的自動(dòng)化測(cè)試,以向?qū)У姆绞娇焖俳y(cè)試用例,并根據(jù)測(cè)試用例自動(dòng)生成測(cè)試腳本,系統(tǒng)根據(jù)測(cè)試任務(wù)自動(dòng)進(jìn)行測(cè)試,減輕測(cè)試工程的工作強(qiáng)度。ETest既可以可視化創(chuàng)建狀態(tài)機(jī)、通信時(shí)序、信號(hào)處理等多種可執(zhí)行模型,也可以使用腳本編程實(shí)現(xiàn)靈活豐富的動(dòng)態(tài)控制功能,內(nèi)置百余項(xiàng)API和界面組件,讓測(cè)控系統(tǒng)開(kāi)發(fā)變得輕松、簡(jiǎn)單,滿足客戶敏捷化與個(gè)性化需求。提供全方位的執(zhí)行過(guò)程監(jiān)控,測(cè)試過(guò)程數(shù)據(jù)自動(dòng)記錄,并生成符合要求的測(cè)試報(bào)告。實(shí)現(xiàn)高效率、高質(zhì)量的的軟件交付。

本文參考文件:網(wǎng)絡(luò)

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號(hào)
公眾號(hào)
在線咨詢(xún)
分享本頁(yè)
返回頂部