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