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