TimeMachine -- 新一代的調(diào)試技術(shù)
嚴(yán)永紅 上海祥佑數(shù)碼科技有限公司 研發(fā)部經(jīng)理
隨著技術(shù)的發(fā)展,嵌入式系統(tǒng)已變得越來越復(fù)雜。這同時(shí)體現(xiàn)在軟硬件設(shè)計(jì)兩個(gè)方面。在硬件上,一方面是時(shí)鐘頻率越來越高,另一方面是在同一系統(tǒng)中往往集成了多個(gè)CPU內(nèi)核,有同構(gòu)的,也有異構(gòu)的。在軟件上,各種復(fù)雜的操作系統(tǒng)也都被用到嵌入式系統(tǒng)中,而且這些復(fù)雜的操作系統(tǒng)往往兼具了傳統(tǒng)實(shí)時(shí)操作系統(tǒng)和桌面系統(tǒng)的功能和優(yōu)點(diǎn)。所有這一切,都使嵌入式系統(tǒng)的性能大大提高,但同時(shí)也對(duì)開發(fā)過程提出了嚴(yán)峻的挑戰(zhàn)。特別是在調(diào)試和測(cè)試方面。
在這樣一個(gè)復(fù)雜的系統(tǒng)中,一個(gè)錯(cuò)誤的出現(xiàn)往往牽扯到很多方面。一個(gè)簡(jiǎn)單的經(jīng)常出現(xiàn)的錯(cuò)誤可以在調(diào)試器中很容易被找到并修正,只要能順序地跟蹤代碼。而一個(gè)難以重現(xiàn)的錯(cuò)誤往往占用我們大量時(shí)間去尋找產(chǎn)生錯(cuò)誤的源頭。這樣的錯(cuò)誤往往在用調(diào)試器調(diào)試時(shí)不會(huì)出現(xiàn)。我們只能一遍又一遍地在代碼中加入打印語句來收集錯(cuò)誤出現(xiàn)的一些蛛絲馬跡,然后再猜測(cè)錯(cuò)誤的源頭。這種方法往往只能達(dá)到事倍功半的效果,而且隨著軟硬件復(fù)雜程度的增加,消耗在這一過程中的實(shí)踐會(huì)成倍的增加。
今天,隨著調(diào)試除錯(cuò)技術(shù)的發(fā)展,新的技術(shù)不斷的引入,我們已經(jīng)能夠追蹤和控制這種復(fù)雜的錯(cuò)誤。采用新技術(shù)的調(diào)試器可以讓系統(tǒng)在發(fā)生錯(cuò)誤時(shí)停下,并從錯(cuò)誤現(xiàn)象產(chǎn)生之處往回單步或直接運(yùn)行到錯(cuò)誤的源頭。這樣不但能使你抓住這個(gè)錯(cuò)誤,而且能重現(xiàn)整個(gè)產(chǎn)生錯(cuò)誤的各個(gè)步驟,讓一個(gè)復(fù)雜的錯(cuò)誤變得簡(jiǎn)單、容易重現(xiàn)。例如Green Hills研制的新技術(shù)Time Machine。它集成了實(shí)時(shí)跟蹤、反向追蹤以及多核技術(shù)。
實(shí)時(shí)跟蹤利用CPU內(nèi)部的一個(gè)端口,把CPU內(nèi)部的動(dòng)態(tài)信息傳送出來。這些信息包括執(zhí)行過的指令,這些指令執(zhí)行時(shí)所訪問的內(nèi)存空間地址,以及所有這些動(dòng)作的時(shí)間戳。所有這些信息都是在CPU全速運(yùn)行時(shí)送出來的,所以這是的信息都是和正常使用的情況相一致的?,F(xiàn)在很多CPU都帶有這樣的功能,ARM7, ARM9, ARM11, POWERPC-4XX, POWERPC-54XX, ColdFire等等。
為了接收這些信息,需要一個(gè)設(shè)備,叫Trace Probe?,F(xiàn)在的Trace Probe可以存儲(chǔ)高達(dá)千兆字節(jié)的信息。在Trace分析軟件的幫助下,我們可以通過這些大量的數(shù)據(jù)重復(fù)系統(tǒng)的功能,重構(gòu)時(shí)間序列,定位錯(cuò)誤和無效代碼。在這之前,一般是采用硬件邏輯分析儀來做這樣的工作,但邏輯分析儀只能采集到外部的地址和數(shù)據(jù)總線,并不能看到CPU內(nèi)部的信息,例如緩存的動(dòng)作。
Green Hills提供的高級(jí)的跟蹤分析工具還能在更高的層次上分析整個(gè)系統(tǒng)。例如在RTOS的層面上,Trace工具可以幫助用戶理解操作系統(tǒng)中各種事件和資源之間復(fù)雜的交互。例如,提供任務(wù)切換和中斷延時(shí)的精確測(cè)量,還能讓用戶檢查和分析在系統(tǒng)范圍內(nèi),事件和任務(wù)之間交互。各種事件如任務(wù)切換,異常,中斷,系統(tǒng)調(diào)用,用戶事件,人物狀態(tài)改變等等都可以用圖示化的方式在時(shí)間軸上圖示所示。
反向追蹤是建立在Trace基礎(chǔ)上的一項(xiàng)新技術(shù)。當(dāng)Trace分析工具掌握了整個(gè)指令執(zhí)行的順序和當(dāng)時(shí)的內(nèi)存映像,這些信息可以用來作為調(diào)試的基礎(chǔ),而不用再真正連接到目標(biāo)板上。調(diào)試器把原始的指令翻譯為源代碼行,把內(nèi)存的值轉(zhuǎn)換為變量,這樣可以使你很容易看到每一個(gè)時(shí)間點(diǎn)上程序的狀態(tài),當(dāng)然你也可以讓產(chǎn)生錯(cuò)誤的過程重新按原來的路徑走一遍。這時(shí)候,調(diào)試器不但可以讓你向前單步更新系統(tǒng)狀態(tài),也可以反向復(fù)原系統(tǒng),你甚至可以設(shè)置斷點(diǎn)和觀察點(diǎn),讓系統(tǒng)狀態(tài)復(fù)原到斷點(diǎn)或觀察點(diǎn)為止。
{{分頁(yè)}}
反向復(fù)原使你可以更快地找到發(fā)生錯(cuò)誤的源頭,而不僅僅知道發(fā)生錯(cuò)誤現(xiàn)象的地方。你可以檢視各種可能的解決方法。因?yàn)槟阌型暾腡race數(shù)據(jù),你可以很容易地向前或向后調(diào)整程序的狀態(tài)。這是你很快找到那些用傳統(tǒng)調(diào)試技術(shù)很難找到的錯(cuò)誤,因?yàn)閭鹘y(tǒng)調(diào)試技術(shù)要求你在調(diào)試器中重現(xiàn)錯(cuò)誤,這是你必須重啟系統(tǒng),并經(jīng)過一番復(fù)雜的操作才能達(dá)到錯(cuò)誤點(diǎn)。這還算是好運(yùn)的。有些錯(cuò)誤并不是經(jīng)常出現(xiàn),而是和一些偶然的因素相關(guān),這樣你在重現(xiàn)錯(cuò)誤這個(gè)階段就要耗費(fèi)很多的時(shí)間。而且在調(diào)試過程中,一旦你不小心錯(cuò)過了這個(gè)錯(cuò)誤,一切都得重新開始。這樣的噩夢(mèng),每個(gè)工程師應(yīng)該都碰到過。但是有了TimeMachine的追蹤和反向追蹤技術(shù),一切變得不一樣了。你只要追蹤到一次錯(cuò)誤,你就可以充分利用追蹤到的數(shù)據(jù),重復(fù)跟蹤指導(dǎo)錯(cuò)誤找到并修正為止。
一個(gè)復(fù)雜的系統(tǒng)往往會(huì)采用多核技術(shù),可能是跑在同樣主頻上的同種CPU,也可能是跑在不同主頻上的不同的CPU。不論是何種多核架構(gòu),CPU之間的同步和通信都對(duì)于軟件設(shè)計(jì)來講是一個(gè)考驗(yàn)。如果軟件存在瑕疵,一個(gè)細(xì)微的時(shí)延就可能帶來巨大的結(jié)果差異。用傳統(tǒng)的調(diào)試技術(shù)來跟蹤這樣的問題是極其困難的,因?yàn)橹噩F(xiàn)這樣的問題基本上是不可能的。但是,如果你可以把每個(gè)處理器上的實(shí)時(shí)數(shù)據(jù)都記錄下來的話,你就可以按順序恢復(fù)每一個(gè)處理器的狀態(tài)并找出處理器之間的交互關(guān)系。
Green Hills的TimeMachine套件集成了一系列的調(diào)試和分析工具,用來幫助工程師發(fā)現(xiàn)錯(cuò)誤、進(jìn)行測(cè)試和優(yōu)化程序。以可視化的方法呈現(xiàn)整個(gè)程序在時(shí)間上的各種行為。這些工具包括TimeMachine Debugger、PathAnalyzer和Multi-Profile等等。PathAnalyzer以可視化的方法呈現(xiàn)了程序的堆棧在時(shí)間上的變化,這樣可以使你很容易看到程序在那個(gè)地方花了較多的時(shí)間。而且,你還可以很快看出程序各部分之間的交互關(guān)系。
PathAnalyzer
TimeMachine的基礎(chǔ)是要有記錄下來的大量實(shí)時(shí)跟蹤數(shù)據(jù),但還有很大一部分的CPU是沒有硬件跟蹤功能的。怎么辦?對(duì)于這樣的CPU,Green Hills給出了兩種解決辦法,一種叫In-Memory,一種叫TraceEdge。若要使用這兩種辦法,你需要使用Green Hills的編譯工具。一些額外的代碼會(huì)被插入到程序中,而這些額外代碼所產(chǎn)生的信息可以被Time Machine用來重構(gòu)整個(gè)程序的流程。In-Memory TimeMachine 和TraceEdge 與傳統(tǒng)的代碼植入方法相比有明顯的優(yōu)勢(shì)。第一,代碼植入是在Link的時(shí)候而不是在編譯時(shí),這樣使用起來方便而且省時(shí)。第二,TraceEdge 一般僅僅插入一條指令,而In-Memory TimeMachine也只插入一條指令去調(diào)用一個(gè)很小的庫(kù)函數(shù)。這樣在空間和時(shí)間上都不會(huì)對(duì)目標(biāo)程序造成大的影響。第三,使用Green Hills先進(jìn)的Link技術(shù),可以使需要植入代碼的程序塊的數(shù)目最小化,而不是每一個(gè)程序塊都要植入。因?yàn)橛行┏绦驂K會(huì)有相關(guān)性。In-Memory TimeMachine 要使用一塊目標(biāo)系統(tǒng)的內(nèi)存在存放數(shù)據(jù),當(dāng)數(shù)據(jù)填滿后就被JTAG Probe或Debug Agent 送回PC。而TraceEdge不占用目標(biāo)系統(tǒng)內(nèi)存。而且有三種可選的配置,TraceEdge Bus, TraceEdge-PCI, TraceEdge-PMC。用TraceEdge Bus 植入的程序會(huì)向系統(tǒng)的一段無緩存的地址空間寫信息,這一段地址要有一個(gè)獨(dú)立的CS。Trace Probe會(huì)監(jiān)視這一段地址空間,并把抓到的信息存到保存起來。而TraceEdge-PCI 和TraceEdge-PMC 分別需要一塊 TraceEdge PCI卡和PMC卡插到目標(biāo)系統(tǒng)的PCI或PMC槽中,而Trace Probe直接和卡相連。
評(píng)論