專利名稱:一種動(dòng)態(tài)探針方法及其在嵌入式系統(tǒng)中的應(yīng)用的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)性能分析技術(shù)。具體地說,本發(fā)明涉及一種基于動(dòng)態(tài)探測技術(shù)的動(dòng)態(tài)探針實(shí)現(xiàn)方法,以及動(dòng)態(tài)探針在嵌入式系統(tǒng)中的應(yīng)用,以動(dòng)態(tài)收集嵌入式系統(tǒng)的性能信息。
背景技術(shù):
隨著嵌入式技術(shù)的發(fā)展,嵌入式應(yīng)用的不斷增長以及嵌入式系統(tǒng)復(fù)雜性不斷提高,導(dǎo)致嵌入式軟件的規(guī)模和復(fù)雜性也不斷提高,有限的硬件資源和功能越來越強(qiáng)的需求依然是嵌入式軟件開發(fā)領(lǐng)域的主要矛盾,嵌入式軟件必須做到精簡高效、穩(wěn)定可靠。嵌入式軟件的質(zhì)量和開發(fā)周期對產(chǎn)品的最終質(zhì)量和上市時(shí)間起到?jīng)Q定性的影響,這使得嵌入式軟件的開發(fā)、分析與測試成為了研究的熱點(diǎn),而上述問題的基礎(chǔ)在于對嵌入式系統(tǒng)性能信息的探測和收集。如何設(shè)計(jì)和實(shí)現(xiàn)一種新的性能信息探測和收集方法,完整準(zhǔn)確高效收集嵌入式系統(tǒng)的性能信息已經(jīng)迫在眉梢。
從性能數(shù)據(jù)的收集方式的角度來分類,可將目前主流的性能數(shù)據(jù)收集方式分成兩大類,采樣技術(shù)和探測技術(shù)。其中探測技術(shù)又分為靜態(tài)探測技術(shù)和動(dòng)態(tài)探測技術(shù)。
使用采樣技術(shù)測量系統(tǒng)性能,首先需要周期性中斷應(yīng)用程序,獲取當(dāng)前程序計(jì)數(shù)器的值,累計(jì)一段時(shí)間之后,通過統(tǒng)計(jì)分析就可以得到有關(guān)性能的精確結(jié)果,從而知道程序的熱點(diǎn)所在。這種性能測量的方法很簡單,不需要增加額外的探測代碼,而且對系統(tǒng)的性能干擾很少。目前市場上覆蓋測試工具gcov,性能分析工具gprof、VTune等工具都是系統(tǒng)級或者用戶級的采樣工具。采樣技術(shù)實(shí)現(xiàn)簡單,但是存在一定的缺陷。首先,采樣技術(shù)建立在中斷機(jī)制的基礎(chǔ)之上,不精確的中斷機(jī)制將會(huì)導(dǎo)致不能正確分配指令引起的事件,導(dǎo)致采樣失真;其次,采樣的量度是固定的,使得采樣受限制于采樣點(diǎn),僅僅適合于針對某一特殊目的的有限的性能分析;采樣的時(shí)間標(biāo)準(zhǔn)受限制,因而只能反映采樣進(jìn)程活躍的時(shí)間,當(dāng)發(fā)生了進(jìn)程切換的時(shí)候,時(shí)間記錄有可能被誤記。采樣是定時(shí)執(zhí)行的,需要額外訪問系統(tǒng)的定時(shí)器,且頻繁使用中斷,開銷較大。采樣只能描述統(tǒng)計(jì)信息,提供系統(tǒng)快照,無法刻畫進(jìn)程間交互信息,不能理解和觀測系統(tǒng)動(dòng)態(tài)狀況。
靜態(tài)探測技術(shù)通常是直接在程序源代碼中的特定位置插入顯式的測量代碼,以生成性能信息。使用這種方法獲取性能信息時(shí),需要重新對程序的源代碼進(jìn)行編譯,然后運(yùn)行新編譯的源程序。在程序性能分析的過程中,靜態(tài)探測方式首先將用于性能分析的補(bǔ)丁代碼添加進(jìn)應(yīng)用程序源代碼,然后重新配置編譯源碼,之后運(yùn)行編譯生成的可執(zhí)行程序,程序運(yùn)行之后就可獲得性能分析信息。著名的內(nèi)核探測工具LTT(Linux Trace Toolkit)就是采用靜態(tài)探測技術(shù)實(shí)現(xiàn)的。靜態(tài)探測技術(shù)通常是生成永久保存的性能信息文件以搜集性能數(shù)據(jù),方便和利用其他的數(shù)據(jù)分析工具進(jìn)行分析。但是靜態(tài)探測技術(shù)存在一些問題。首先,添加增量代碼添加了代碼開銷和執(zhí)行開銷,當(dāng)探測不斷需要精確化的時(shí)候,總是需要重新編譯和運(yùn)行應(yīng)用程序。而且為了避免開銷過大,不適宜定義過多的探測點(diǎn)。因此記錄事件的范圍收到了限制,記錄信息的全面性和詳細(xì)性都有所欠缺,不能完全反應(yīng)系統(tǒng)行為。靜態(tài)探測的方法在靈活性上也有所缺乏,他探測的需求變化的時(shí)候,需要對探測操作進(jìn)行重新定義。
與靜態(tài)探測技術(shù)不同,采用動(dòng)態(tài)探測方式對系統(tǒng)性能數(shù)據(jù)進(jìn)行采集的時(shí)候不需要對程序的源代碼預(yù)先修改,編寫應(yīng)用程序的時(shí)候不需要考慮將來做性能分析時(shí)是否要插入動(dòng)態(tài)探測點(diǎn),即探測點(diǎn)的定義、插入和刪除等等的操作和應(yīng)用程序源碼的編寫完全無關(guān)。在進(jìn)行性能分析的時(shí)候,使用某種方式記錄需要插入探測點(diǎn)的地址以及對應(yīng)該探測點(diǎn)所定義的處理方式,程序源代碼不需要做任何的改動(dòng)。只有當(dāng)被測試程序調(diào)入系統(tǒng)內(nèi)存中準(zhǔn)備運(yùn)行的時(shí)候,才利用相關(guān)的技術(shù),動(dòng)態(tài)修改代碼,從而達(dá)到收集相關(guān)信息的目的。IBM的Dprobes技術(shù)就是采用動(dòng)態(tài)探測技術(shù),在執(zhí)行代碼的模塊中動(dòng)態(tài)插入軟件探針以收集相關(guān)信息。動(dòng)態(tài)探測技術(shù)克服了靜態(tài)探測技術(shù)的缺點(diǎn),但是完全采用動(dòng)態(tài)探測機(jī)制時(shí),激活大量的探測點(diǎn)需要很大的開銷,而且動(dòng)態(tài)探測機(jī)制對正確性的要求很高,一旦誤用,會(huì)導(dǎo)致系統(tǒng)的崩潰。
而對于嵌入式系統(tǒng)的性能分析技術(shù)上,目前嵌入式性能分析大多采用采樣方式或者靜態(tài)探測的方法收集性能數(shù)據(jù)。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提供一種動(dòng)態(tài)探針的方法,提高數(shù)據(jù)收集的正確性、精確性以及完備性,使之能高效、穩(wěn)定地運(yùn)行目標(biāo)機(jī)平臺(tái)。
本發(fā)明的另一目的在于提供一種動(dòng)態(tài)探針在嵌入式系統(tǒng)中的應(yīng)用。
本發(fā)明所要解決的技術(shù)問題是設(shè)計(jì)一種新型的嵌入式動(dòng)態(tài)探針并將之高效實(shí)現(xiàn),將其應(yīng)用在嵌入式的性能分析工具中。主要目標(biāo)是實(shí)現(xiàn)嵌入式目標(biāo)機(jī)性能數(shù)據(jù)的動(dòng)態(tài)收集,滿足嵌入式性能分析需求。
為了實(shí)現(xiàn)發(fā)明目的一,采用的技術(shù)方案如下一種動(dòng)態(tài)探針方法,在被測程序運(yùn)行時(shí)采用斷點(diǎn)機(jī)制將探針插入到被測程序中;具體實(shí)現(xiàn)過程為首先確定探針的插入位置,在插入位置處用探針調(diào)用指令替換原有的指令,然后執(zhí)行探針指令,等待探針動(dòng)作完成之后,再執(zhí)行插入位置處的原指令。
上述技術(shù)方案中,所述探針包括嵌入式動(dòng)態(tài)探針管理器和嵌入式動(dòng)態(tài)探針庫;所述嵌入式動(dòng)態(tài)探針管理器負(fù)責(zé)探針的定義、注冊、查詢、刪除,所述嵌入式動(dòng)態(tài)探針庫存儲(chǔ)已定義的探針。
本發(fā)明的動(dòng)態(tài)探針方法以斷點(diǎn)機(jī)制為基礎(chǔ),當(dāng)處理器執(zhí)行斷點(diǎn)指令的時(shí)候,將產(chǎn)生斷點(diǎn)異常,將控制權(quán)限轉(zhuǎn)移到異常處理程序。動(dòng)態(tài)探針利用動(dòng)態(tài)指令替換技術(shù),用斷點(diǎn)指令替換要調(diào)試的特定地址的指令,程序執(zhí)行到斷點(diǎn)指令的時(shí)候,將觸發(fā)斷點(diǎn)異常。此時(shí),經(jīng)過修改的斷點(diǎn)中斷處理程序會(huì)及時(shí)通知調(diào)試器,檢查斷點(diǎn)發(fā)生的地址,搜索斷點(diǎn)處對應(yīng)的斷點(diǎn)處理過程等等。采用這種技術(shù),探針將完全動(dòng)態(tài)插入到內(nèi)存代碼中,定義、插入和刪除探針的探針操作的編寫和應(yīng)用程序源代碼的編寫完全無關(guān)。即應(yīng)用程序的開發(fā)人員在編寫程序源代碼的過程中完全不需要考慮在程序運(yùn)行的時(shí)候是否要插入動(dòng)態(tài)探針,使用動(dòng)態(tài)探針的時(shí)候也不需要修改程序的源代碼。
在不同體系結(jié)構(gòu)的處理器中,使用不同的斷點(diǎn)指令。IA-32的體系結(jié)構(gòu)中,采用INT3斷點(diǎn)指令,在ARM體系結(jié)構(gòu)中,使用Break斷點(diǎn)指令。斷點(diǎn)的處理方法可由用戶定義。調(diào)試器不做任何的代碼修改動(dòng)作,只是采用特定的方法記錄需要插入的探針地址和對應(yīng)的探針處理程序。當(dāng)被調(diào)試的程序加載進(jìn)內(nèi)存,并且準(zhǔn)備執(zhí)行的時(shí)候,調(diào)試器要插入探針地址處的內(nèi)容被保存,將其替換成斷點(diǎn)指令。程序運(yùn)行中,當(dāng)執(zhí)行到斷點(diǎn)的位置的時(shí)候激活中斷,經(jīng)過修改的中斷處理程序?qū)⑴袛喑鰯帱c(diǎn)的位置,將控制權(quán)限交給調(diào)試器,以執(zhí)行與此探針對應(yīng)的探針處理程序。執(zhí)行完畢之后再用原來的指令替換掉斷點(diǎn)指令,或者模擬執(zhí)行原有的指令,然后進(jìn)行后續(xù)的處理。探針可以多次被觸發(fā),即在原指令執(zhí)行完畢的時(shí)候可以再次使用斷點(diǎn)指令進(jìn)行替換。
為了實(shí)現(xiàn)發(fā)明目的二,采用的技術(shù)方案如下一種動(dòng)態(tài)探針方法在嵌入式系統(tǒng)中的應(yīng)用,具體應(yīng)用過程為在嵌入式系統(tǒng)的被測程序運(yùn)行時(shí),采用斷點(diǎn)機(jī)制將探針插入到被測程序例程,以無干擾地收集嵌入式系統(tǒng)的詳細(xì)性能信息。
上述技術(shù)方案中,所述收集嵌入式系統(tǒng)的詳細(xì)性能信息通過由探針對被測程序運(yùn)行時(shí)的相關(guān)信息進(jìn)行探測所實(shí)現(xiàn)。
本發(fā)明在嵌入式系統(tǒng)中的應(yīng)用引用動(dòng)態(tài)探測思想,在嵌入式程序運(yùn)行的同時(shí)動(dòng)態(tài)探測和收集嵌入式系統(tǒng)的相關(guān)信息。這樣進(jìn)行探測和數(shù)據(jù)收集的效率明顯提高,數(shù)據(jù)的精確性和完備性得到較大改善。
本發(fā)明動(dòng)態(tài)探針方法在嵌入式系統(tǒng)中的應(yīng)用提出了若干關(guān)鍵實(shí)現(xiàn)技術(shù)1、指令替換技術(shù)為了實(shí)現(xiàn)探針在程序運(yùn)行的同時(shí)動(dòng)態(tài)插樁,進(jìn)行數(shù)據(jù)的探測和收集,本發(fā)明采取指令替換技術(shù)實(shí)現(xiàn)動(dòng)態(tài)探針的插入。插入斷點(diǎn)、監(jiān)控上下文信息、當(dāng)斷點(diǎn)被觸發(fā)的時(shí)候轉(zhuǎn)儲(chǔ)特定的數(shù)據(jù)區(qū)。當(dāng)被調(diào)試的程序加載進(jìn)內(nèi)存,并且準(zhǔn)備執(zhí)行的時(shí)候,調(diào)試器要插入探針地址處的內(nèi)容被保存,將其替換成斷點(diǎn)指令。程序運(yùn)行中,當(dāng)執(zhí)行到斷點(diǎn)的位置的時(shí)候激活中斷,經(jīng)過修改的中斷處理程序?qū)⑴袛嗵帞帱c(diǎn)的位置,將控制權(quán)限交給調(diào)試器,以執(zhí)行與此探針對應(yīng)的探針處理程序。執(zhí)行完畢之后再用原來的指令替換掉斷點(diǎn)指令,或者模擬執(zhí)行原有的指令,然后進(jìn)行后續(xù)的處理。
2、動(dòng)態(tài)探針的插裝策略探針插樁策略是指探針植入的位置。在本發(fā)明中,為了滿足嵌入式開發(fā)的需求,按照探針完成的任務(wù)劃分,可以探針的策略分成七種類型函數(shù)探針、基本塊探針、分支探針、斷言探針、時(shí)間探針、變量跟蹤探針和系統(tǒng)信息跟蹤探針。每種類型的探針采用特定的插裝策略,動(dòng)態(tài)探測嵌入式系統(tǒng)的相應(yīng)信息。
3、動(dòng)態(tài)探針的類型在本發(fā)明中,針對嵌入式開發(fā)的需求,設(shè)計(jì)兩類十四種動(dòng)態(tài)探針函數(shù),用以在嵌入式開發(fā)中動(dòng)態(tài)探測各種類型的信息。其中一類為跟應(yīng)用程序信息相關(guān)的探針,主要有函數(shù)插樁探針函數(shù)、塊插樁探針函數(shù)、分支插樁探針函數(shù)、時(shí)間插樁探針函數(shù)、斷言插樁探針、字符變量插樁探針函數(shù)、整型變量插樁探針函數(shù)、長整型變量插樁探針函數(shù)、浮點(diǎn)變量插樁探針函數(shù)、雙精度浮點(diǎn)變量插樁探針函數(shù)、長雙精度浮點(diǎn)變量插樁探針函數(shù)。另一類為跟探測系統(tǒng)信息相關(guān)的探針有CPU探針、I/O探針、內(nèi)存探針。
在設(shè)計(jì)嵌入式動(dòng)態(tài)探針的時(shí)候,既不能影響探針本身的特性,包括動(dòng)態(tài)性和執(zhí)行效率,而且要注意符合跟蹤的需求;既要提高使用效率,又要方便探針的管理。本發(fā)明針對如下基本原則,設(shè)計(jì)和實(shí)現(xiàn)嵌入式動(dòng)態(tài)探針1、保持動(dòng)態(tài)性嵌入式動(dòng)態(tài)探針的基本特性是動(dòng)態(tài)性,在設(shè)計(jì)時(shí)的前提條件時(shí)保持其動(dòng)態(tài)的特性。探針的動(dòng)態(tài)性是指在運(yùn)行的程序中放置探針的能力,探針的插入不需要修改程序的源代碼,而是將嵌入式探針插入以加載的運(yùn)行的代碼中,并覆蓋探針地址處的指令,原指令在探針處理結(jié)束之后被模擬執(zhí)行。若探針沒有被激活,則系統(tǒng)運(yùn)行沒有任何改變,系統(tǒng)的性能不受任何的影響。
2、記錄日志嵌入式探針根據(jù)跟蹤機(jī)制的要求,主要用于記錄特定代碼處的事件日志信息。因此,定義的標(biāo)準(zhǔn)動(dòng)態(tài)探針模塊需要將探針處理程序和記錄的具體時(shí)間相綁定,用戶使用的時(shí)候不要額外編寫,只需要提供相應(yīng)的入口地址就可以注冊插入。
3、消除依賴性探針處理程序設(shè)計(jì)成中斷處理程序一樣運(yùn)行。這需要最大限度的減少探針處理接口對系統(tǒng)接口和資源的依賴性,并容易從潛在的致命錯(cuò)誤中恢復(fù)。探針的放置位置不受限制,探針處理程序執(zhí)行的時(shí)間不受限制,如果探針放置到錯(cuò)誤的位置,該探針能被探測到并且被自動(dòng)移除,不影響系統(tǒng)的正常運(yùn)行。
本發(fā)明的動(dòng)態(tài)探針可以放置在任何的位置,包括被測應(yīng)用程序和第三方應(yīng)用中。第三方程序包括操作系統(tǒng)內(nèi)核模塊,動(dòng)態(tài)共享庫,應(yīng)用程序等等。探針的設(shè)置全局有效,并且能夠與其他的調(diào)試器配合使用。若探針方式在可執(zhí)行程序中,則探針在所有此程序的實(shí)例中活躍;若探針放置在動(dòng)態(tài)共享庫中,則探針在所有應(yīng)用此共享庫的進(jìn)程上下文中活躍;甚至在處理調(diào)試器控制之下的進(jìn)程實(shí)例中的探針都是有效的。被激活的探針對當(dāng)前駐留在物理內(nèi)存中虛地址空間中的任何區(qū)域都擁有讀和寫的權(quán)限。
對比現(xiàn)有嵌入式性能分析工具的數(shù)據(jù)采集方法,本發(fā)明所述的嵌入式動(dòng)態(tài)探針的最顯著特色是數(shù)據(jù)動(dòng)態(tài)收集,而且靈活性高,方法簡便,易于實(shí)現(xiàn)。實(shí)驗(yàn)結(jié)果表明,采用嵌入式動(dòng)態(tài)探針收集的數(shù)據(jù)正確性、準(zhǔn)確性和完備性都較好。
和IBM的動(dòng)態(tài)探針Dprobes相比,本發(fā)明所述的嵌入式動(dòng)態(tài)探針有以下幾個(gè)特點(diǎn)首先,IBM的Dprobes主要應(yīng)用于單機(jī)環(huán)境下的探測,本發(fā)明所描述的動(dòng)態(tài)探針是針對于嵌入式開發(fā)的特點(diǎn)及需求設(shè)計(jì)的,適用于嵌入式交叉開發(fā)的特殊要求。探針的源代碼經(jīng)過交叉編譯后生成探針二進(jìn)制程序,然后通過串口、JTAG或者網(wǎng)絡(luò)的方式下載到嵌入式平臺(tái)上,在嵌入式平臺(tái)上執(zhí)行動(dòng)態(tài)探測的任務(wù)。
其次,由于本發(fā)明的探針植入基于斷點(diǎn)機(jī)制,故而本發(fā)明所描述的嵌入式動(dòng)態(tài)探針的適用范圍比Dprobes更加廣泛。IBM的Dprobes只能應(yīng)用于X86體系結(jié)構(gòu)的計(jì)算機(jī)上,而本發(fā)明所述的動(dòng)態(tài)探針可以應(yīng)用到任何體系結(jié)構(gòu)的嵌入式平臺(tái)上,不但包括X86體系結(jié)構(gòu),還包括ARM,MIPS及51等常見的嵌入式處理器的體系結(jié)構(gòu)。探針的使用者只需了解待開發(fā)的嵌入式平臺(tái)相應(yīng)的斷點(diǎn)指令即可。
再次,本發(fā)明所描述的嵌入式動(dòng)態(tài)探針比Dprobes更加靈活。Dprobes探測到的信息的種類是固定的,不能更改。而本發(fā)明中設(shè)計(jì)的嵌入式動(dòng)態(tài)探針可以根據(jù)需求定制不同類型的探針以收集特定的信息。這樣,本發(fā)明中所描述的動(dòng)態(tài)探針可以應(yīng)用在嵌入式性能分析工具、嵌入式覆蓋測試工具的數(shù)據(jù)收集和探測中。
最后,本發(fā)明所描述的嵌入式動(dòng)態(tài)探針探測到的信息比Dprobes更加全面。IBM的Dprobes一般應(yīng)用于內(nèi)核信息的探測和收集,而本發(fā)明的嵌入式動(dòng)態(tài)探針不但可以探測嵌入式系統(tǒng)的信息,還能夠探測嵌入式應(yīng)用程序運(yùn)行時(shí)的相關(guān)信息。
圖1為嵌入式動(dòng)態(tài)探針運(yùn)行過程示意圖;圖2為嵌入式動(dòng)態(tài)探測框架EM-DDF結(jié)構(gòu)圖;圖3為嵌入式探針EM-DP結(jié)構(gòu)組成圖;圖4為嵌入式探針插入過程示意圖;圖5為嵌入式探針的處理過程示意圖。
具體實(shí)施例方式
下面結(jié)合附圖,對本發(fā)明的具體實(shí)施做進(jìn)一步的詳細(xì)描述。
嵌入式動(dòng)態(tài)探針工作流程如附圖1所示原先程序的執(zhí)行過程表現(xiàn)為一系列的順序指令流。使用探針必須首先確定探針點(diǎn),即探針插入的位置。確定探針點(diǎn)之后,在探針點(diǎn)處用探針調(diào)用指令替換探針點(diǎn)處原有的指令,然后執(zhí)行探針指令。等待探針動(dòng)作完成之后,需要執(zhí)行探針點(diǎn)處的原指令,然后繼續(xù)執(zhí)行原先應(yīng)用程序探針點(diǎn)之后的指令流。
為了對應(yīng)用程序進(jìn)行探測,要建立相應(yīng)的探測模型和探針模型。探測模型負(fù)責(zé)系統(tǒng)模塊劃分“線性塊”和“探針”設(shè)計(jì);探針模型負(fù)責(zé)探針初始化、相關(guān)信息獲取、測試信息記錄。
探測模型為T={MB,PD},其中,T為探測模型,MB為程序模塊線性塊過程,PD為探針模型。探針模型為PD={PI,PT,PW},其中PI為探針初始化過程,PT為探針信息獲取過程,PW為探針收集信息記錄過程。
在對程序進(jìn)行探測時(shí),首先將程序劃分為各個(gè)線性塊,然后為線性塊聲明探針變量,為探針變量賦初值;探針初始化執(zhí)行測試信息獲取,當(dāng)有錯(cuò)誤發(fā)生時(shí),保護(hù)局部現(xiàn)場、探針目標(biāo)定位和目標(biāo)類型的識(shí)別等;最后把探針測試結(jié)果記錄起來,修改探針變量,恢復(fù)現(xiàn)場。
探針變量以矩陣PMB表示,其中M為系統(tǒng)劃分的模塊數(shù),在具體應(yīng)用程序系統(tǒng)中,M為各模塊事件過程和函數(shù)之和的最大值;B為各個(gè)模塊劃分線性塊分支數(shù)的最大值。
本發(fā)明中的采用動(dòng)態(tài)探測技術(shù),建立嵌入式動(dòng)態(tài)探測框架EM-DDF。EM-DDF的主要目標(biāo)是獲得詳細(xì)的性能數(shù)據(jù)。在系統(tǒng)中設(shè)置探測點(diǎn),對程序的運(yùn)行情況進(jìn)行跟蹤,為開發(fā)者提供性能數(shù)據(jù),以達(dá)成其消除熱點(diǎn)和瓶頸的目標(biāo)。因此EM-DDF立足于在系統(tǒng)中設(shè)置跟蹤探測點(diǎn),以獲得程序運(yùn)行時(shí)的性能信息。
如附圖2所示EM-DDF提供了強(qiáng)行進(jìn)入任何應(yīng)用程序例程無干擾地收集信息的接口,使用它可以輕松地收集處理器寄存器和全局?jǐn)?shù)據(jù)結(jié)構(gòu)等調(diào)試信息,用戶也可以利用它執(zhí)行自己編寫的指令收集需要的信息。它的核心包括動(dòng)態(tài)探針管理器DPM(Dynamic Probes Manager)和動(dòng)態(tài)探針事件處理器DPEH(Dynamic Probes Event Handler)。其中DPM負(fù)責(zé)接受探針的注冊或者注銷請求,將每一個(gè)探針定義保存到動(dòng)態(tài)探針對象DPO(Dynamic Probe Object)中,DPO是用于描述探針的對象,其中也包含一些處理指令。無論何時(shí)在內(nèi)存中加載包含探針模塊的頁,都將插入探針,重新加載作廢頁時(shí),探針也將再次插入;DPEH中包含當(dāng)激活探針時(shí)需要執(zhí)行的具體指令,完成對斷點(diǎn)中斷的具體響應(yīng)。EM-DDF為插入動(dòng)態(tài)探針設(shè)計(jì)了三個(gè)函數(shù)預(yù)處理函數(shù)pre-handler,它在執(zhí)行被調(diào)試內(nèi)存地址處的指令之前執(zhí)行;后處理函數(shù)post-handler,它在被調(diào)試指令執(zhí)行之后執(zhí)行;錯(cuò)誤處理函數(shù)error-handler,它在指令出錯(cuò)時(shí)執(zhí)行。該探測框架除了支持跟蹤時(shí)動(dòng)態(tài)編寫探針模塊之外,還支持嵌入式動(dòng)態(tài)探針EM-DP,它是根據(jù)嵌入式性能分析的需求預(yù)先編寫的標(biāo)準(zhǔn)探針,可以直接使用。
如附圖3所示,嵌入式探針EM-DP(Embedded Dynamic Probes)由兩個(gè)部分構(gòu)成,分別是嵌入式動(dòng)態(tài)探針管理器(EDPM)和嵌入式動(dòng)態(tài)探針庫(EDPL)。
其中,嵌入式動(dòng)態(tài)探針管理器是整個(gè)嵌入式動(dòng)態(tài)探針的核心部分,它負(fù)責(zé)探針生命周期中的任何工作,包括探針的查詢,探針的定義,探針的刪除,并向整個(gè)探測機(jī)制的DPM進(jìn)行探針注冊。
用戶可以通過動(dòng)態(tài)探針接口提交探針注冊請求,它和EDPM模塊通信,如果用戶需要插入的探針已存在于探針庫中,EDPM將直接向動(dòng)態(tài)探測機(jī)制中的DPM注冊,否則,就通過EDPM定義探針,首先生成標(biāo)準(zhǔn)探針,并將其保存至探針庫中,然后再到DPM中進(jìn)行注冊。
嵌入式動(dòng)態(tài)探針庫中包含各種類型的嵌入式探針,如線性塊探針、分支探針、模塊探針、I/O探針、時(shí)間探針、同步互斥探針等。這些探針通過EDPM進(jìn)行創(chuàng)建。每一個(gè)探針都包括有三個(gè)處理函數(shù),分別是X_pre_handler()、X_post_handler()以及X_error_handler()。這三個(gè)處理函數(shù)分別在斷點(diǎn)插入指令之前,之后以及指令出錯(cuò)時(shí)執(zhí)行。每個(gè)探針都擁有其唯一性的標(biāo)志-探針標(biāo)識(shí)符。當(dāng)探針被創(chuàng)建的時(shí)候,并不將探針裝配進(jìn)系統(tǒng),而是返回一個(gè)探針標(biāo)識(shí)符,并且將其探針標(biāo)識(shí)符保存進(jìn)探針庫中,以便將來使用。探針庫中的關(guān)鍵部分是一張?zhí)结樀怯洷恚摫碇杏涗浟颂结槍?yīng)的函數(shù)名、探針標(biāo)識(shí)符、探針事件處理程序以及其他一些索引信息。這樣方便可EDPM進(jìn)行探針查詢和動(dòng)態(tài)探針事件處理器(DPEH)在響應(yīng)斷點(diǎn)的時(shí)候執(zhí)行具體的操作。
使用嵌入式動(dòng)態(tài)探針的時(shí)候,通過em-dprobe數(shù)據(jù)結(jié)構(gòu)描述動(dòng)態(tài)探針,它保存了探針插入的位置、探針的三個(gè)處理函數(shù)pre_handler、post_handler以及error_handler,并且形成注冊探針鏈表。em-dprobe具體描述如下struct em-dprobe{
struct list_head list;
char*addr;
char*pre_handler;
char*post_handler;
char*error_handler;
char opcode;
char insn[MAX_INSN_SIZE];
};
其中各個(gè)參數(shù)的說明如下list表示所有打開的探針形成的鏈表;addr表示探針即將插入的位置;pre_handler表示指定的預(yù)處理函數(shù)的位置;post_handler表示指定的后續(xù)處理函數(shù)的位置;error_handler表示出錯(cuò)處理函數(shù)的位置;opcode表示要替換的指令;insn[MAX_INSN_SIZE]表示原來的指令。
為了配合嵌入式動(dòng)態(tài)探針管理器的要求,方便探針的管理和查詢工作,設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)mprobe,保存已經(jīng)存在的探針。mprobe的定義如下所示struct mprobe{int p_index;
char*f_name;
int p_flags;
char*pre_handler;
char*post_handler;
char*error_handler;
};
其中各個(gè)參數(shù)的說明如下p_index記錄該探針在探針?biāo)饕碇械乃饕?;f_name記錄探針對應(yīng)的探針函數(shù)名稱表明探針記錄的跟蹤事件的內(nèi)容;p_flags標(biāo)志探針是否是自定義的;pre_handler表示指定的預(yù)處理函數(shù)的位置;post_handler表示指定的后續(xù)處理函數(shù)的位置;error_handler表示出錯(cuò)處理函數(shù)的位置;使用嵌入式動(dòng)態(tài)探針,在探針插入時(shí)需要判斷該探針是否已經(jīng)存在與探針庫中。如果是,則提供地址入口就可以直接注冊插入;若不是,由EDPM生成新的探針之后,再進(jìn)行注冊。嵌入式探針列表由EDPM負(fù)責(zé)管理和維護(hù)。定義三個(gè)函數(shù)find_probe()、add_probe()和delete_probe(),分別完成現(xiàn)有探針查找、添加用戶自定義探針和刪除用戶自定義探針的動(dòng)作。
探針插樁策略是指探針植入的位置。一般的說,探針在程序的以下位置插樁1、程序的入口和出口處;2、基本塊的入口和出口處;3、轉(zhuǎn)移指令之前,如goto、continue、break、return語言之前;4、標(biāo)號語句之前,如LABLE具體的,對于嵌入式動(dòng)態(tài)探針庫的不同的探針有著不同的插樁策略。按照探針完成的任務(wù)劃分,可以探針的策略分成七種類型函數(shù)探針、基本塊探針、分支探針、斷言探針、時(shí)間探針、變量跟蹤探針和系統(tǒng)信息跟蹤探針。
函數(shù)探針在每個(gè)函數(shù)的第一塊開始處植入該探針,如果函數(shù)被選為插樁,則返回1,否則返回0。另外,對于main()函數(shù)還負(fù)責(zé)創(chuàng)建數(shù)據(jù)跟蹤文件。
基本塊探針為了提高效率,采用了以基本塊單位的語句插樁。一個(gè)基本塊只插樁一次。探針能否被觸發(fā),取決于基本塊所在的函數(shù)被插樁,即基本塊所在函數(shù)的“函數(shù)探針”返回1,同時(shí)該語句所在的塊被執(zhí)行。
分支探針在C語言中,分支結(jié)構(gòu)分為if、if-else、while、do-while、for幾種結(jié)構(gòu)。無論哪種分支結(jié)構(gòu)都含有條件判定,而分支探針則是對條件表達(dá)式的值進(jìn)行跟蹤。分支探針在上述語句時(shí)被植入。
斷言探針斷言表現(xiàn)為一邏輯表達(dá)式,因此斷言探針只需在斷言設(shè)置位置的下一語句首部植入以斷言為內(nèi)容的邏輯表達(dá)式。如果該斷言所在的語句被執(zhí)行,則斷言探針向數(shù)據(jù)跟蹤文件中寫入1或0。
變量跟蹤探針變量跟蹤支持了所有C語言的原子類型變量,但在變量跟蹤探針上化歸為6類數(shù)據(jù)類型。變量跟蹤探針使用的默認(rèn)條件是,變量必須在聲明后的某處被跟蹤。實(shí)現(xiàn)變量跟蹤的方法是在跟蹤處向植入變量跟蹤探針函數(shù)。
時(shí)間探針在指明時(shí)間跟蹤的地方,植入時(shí)間探針函數(shù)以截獲的系統(tǒng)時(shí)間。
系統(tǒng)信息跟蹤探針在程序開始的地方植入系統(tǒng)信息跟蹤探針,在程序運(yùn)行的過程中全程跟蹤獲取系統(tǒng)信息。
插入探針的過程如附圖4所示嵌入式動(dòng)態(tài)探針在被調(diào)用時(shí)注冊,并在調(diào)用完成時(shí)注銷。因此,構(gòu)造函數(shù)init_probe()和exit_probe()。init_probe()函數(shù)完成注冊初始化,它首先填寫em-dprobe結(jié)構(gòu),然后調(diào)用register_em-dprobe()進(jìn)行探針注冊,并將所有已注冊的探針形成一個(gè)探針鏈表。exit_probe()則取消注冊探針。
探針注冊主要通過register_em-dprobe()函數(shù)完成。該函數(shù)的核心是em-dprobe用斷點(diǎn)指令替換需插入探針內(nèi)存地址處相應(yīng)的指令,而原來的指令將被保存。函數(shù)執(zhí)行過程如下首先在探針鏈表中增加新的探針節(jié)點(diǎn);其次保存原地址處的指令;用斷點(diǎn)指令進(jìn)行指令替換工作;最后返回。
探針的注銷工作由unregister_em-dprobe()函數(shù)完成,該函數(shù)主要的工作就是從探針鏈表中刪除節(jié)點(diǎn)。
探針的注冊和注銷都是需要操作探針鏈表,因此必須互斥的進(jìn)行,保持注冊和注銷操作的原子性,以免發(fā)生錯(cuò)誤。
在探針注冊之后,注冊函數(shù)register_em-dprobe()使用斷點(diǎn)指令替換原有的指令,當(dāng)程序控制達(dá)到斷點(diǎn)的地址時(shí),執(zhí)行斷點(diǎn)異常處理。原有的斷點(diǎn)異常處理程序被探針修改。此時(shí),將檢查在斷點(diǎn)的地址處是否存在探針,如果存在,就執(zhí)行探針預(yù)處理程序,然后執(zhí)行探針內(nèi)部的指令,執(zhí)行探針動(dòng)作,隨后執(zhí)行探針后處理程序,期間若發(fā)生錯(cuò)誤則執(zhí)行探針出錯(cuò)處理程序;如果不存在就將執(zhí)行正常的斷點(diǎn)異常處理程序,最后提交日志。探針處理過程如附圖5所示其中,探針預(yù)處理程序由em-dprobe_pre_handler()函數(shù)執(zhí)行,該函數(shù)屏蔽中斷,保存探針插入地址的原指令,然后進(jìn)行指令替換,并且調(diào)用用戶自己定義的pre_handler();探針后處理程序由em-dprobe_post_handler()函數(shù)執(zhí)行,該函數(shù)展開用戶自己定義的post_handler();探針出錯(cuò)處理程序由em-dprobe_error_handler()函數(shù)執(zhí)行,該函數(shù)負(fù)責(zé)調(diào)用用戶定義的出錯(cuò)處理程序error_handler()。
嵌入式動(dòng)態(tài)探針庫(EDPL)中包含各種不同的嵌入式動(dòng)態(tài)探針,用來在嵌入式的性能分析的過程中,跟蹤和收集不同類型信息。根據(jù)嵌入式性能分析過程中要收集和獲取的信息,探針分成兩大類,一部分是用來收集跟應(yīng)用程序信息相關(guān)的探針;另一部分是收集系統(tǒng)相關(guān)信息的探針。具體的探針函數(shù)如下跟應(yīng)用程序信息相關(guān)的探針函數(shù)插樁探針函數(shù)func_probe()該探針的作用是在函數(shù)執(zhí)行時(shí)插樁,收集函數(shù)執(zhí)行情況的相關(guān)數(shù)據(jù),包括函數(shù)ID、函數(shù)調(diào)用者和被調(diào)用者、函數(shù)被調(diào)用次數(shù)、函數(shù)參數(shù)等信息。
塊插樁探針函數(shù)block_probe()該探針的作用是在基本塊執(zhí)行時(shí)插樁,收集基本塊執(zhí)行情況的相關(guān)數(shù)據(jù),包括基本塊ID、基本塊執(zhí)行次數(shù)、基本塊所屬函數(shù)等。
分支插樁探針函數(shù)branch_probe()該探針的作用是在分支執(zhí)行時(shí)進(jìn)行插樁,跟蹤分支執(zhí)行情況。
時(shí)間插樁探針函數(shù)time_probe()該探針的作用是對程序進(jìn)行時(shí)間插樁,收集相關(guān)的時(shí)間信息,包括程序開始/結(jié)束時(shí)刻、函數(shù)開始/結(jié)束時(shí)刻、基本塊開始/結(jié)束時(shí)刻等等。
斷言插樁探針assert_probe()該探針的作用是跟蹤斷言結(jié)果。
字符變量插樁探針函數(shù)var_char_probe()該探針的作用是跟蹤字符類型變量。
整型變量插樁探針函數(shù)var_int_probe()該探針的作用是整形變量。
長整型變量插樁探針函數(shù)var_long_int_probe()該探針的作用是跟蹤長整形變量。
浮點(diǎn)變量插樁探針函數(shù)var_float_probe()該探針的作用是跟蹤float類型的變量。
雙精度浮點(diǎn)變量插樁探針函數(shù)var_double_probe()該探針的作用是跟蹤double類型的變量。
長雙精度浮點(diǎn)變量插樁探針函數(shù)var_long_double_probe()該探針的作用是跟蹤longdouble類型的變量。
跟探測系統(tǒng)信息相關(guān)的探針CPU探針cpu_probe()該探針的作用是跟蹤并收集CPU相關(guān)信息;I/O探針io_probe()該探針的作用是跟蹤并收集I/O相關(guān)信息;內(nèi)存探針mem_probe()該探針的作用是跟蹤并收集內(nèi)存相關(guān)信息。
權(quán)利要求
1.一種動(dòng)態(tài)探針方法,其特征在于在被測程序運(yùn)行時(shí)采用斷點(diǎn)機(jī)制將探針插入到被測程序中;具體實(shí)現(xiàn)過程為首先確定探針的插入位置,然后在插入位置處用探針調(diào)用指令替換原有的指令,執(zhí)行探針指令,等待探針動(dòng)作完成之后,再執(zhí)行插入位置處的原指令。
2.根據(jù)權(quán)利要求1所述的動(dòng)態(tài)探針方法,其特征在于所述探針包括嵌入式動(dòng)態(tài)探針管理器和嵌入式動(dòng)態(tài)探針庫;所述嵌入式動(dòng)態(tài)探針管理器負(fù)責(zé)探針的定義、注冊、查詢、刪除,所述嵌入式動(dòng)態(tài)探針庫存儲(chǔ)已定義的探針。
3.根據(jù)權(quán)利要求1或2所述的動(dòng)態(tài)探針方法,其特征在于通過em-dprobe數(shù)據(jù)結(jié)構(gòu)對所述探針進(jìn)行描述,所述em-dprobe具體如下struct em-dprobe{struct list_head list;char *addr;char*pre_handler;char*post_handler;char*error_handler;char opcode;char insn[MAX_INSN_SIZE];};其中,list表示所有打開的探針?biāo)纬傻逆湵?;addr表示探針即將插入的位置;pre_handler表示指定的預(yù)處理函數(shù)的位置;post_handler表示指定的后續(xù)處理函數(shù)的位置;error_handler表示出錯(cuò)處理函數(shù)的位置;opcode表示要替換的指令;charinsn[MAX_INSN_SIZE]表示原來的指令。
4.根據(jù)權(quán)利要求3所述的動(dòng)態(tài)探針方法,其特征在于采用數(shù)據(jù)結(jié)構(gòu)mprobe描述保存的已存在的探針,所述mprobe的定義如下struct mprobe{int p_index;char*f_name;int p_flags;char*pre_handler;char*post_handler;char*error_handler;};其中,p_index記錄該探針在探針?biāo)饕碇械乃饕担籪_name記錄探針對應(yīng)的探針函數(shù)名稱表明探針記錄的跟蹤事件的內(nèi)容;p_flags標(biāo)志探針是否是自定義的;pre_handler表示指定的預(yù)處理函數(shù)的位置;post_handler表示指定的后續(xù)處理函數(shù)的位置;error_handler表示出錯(cuò)處理函數(shù)的位置。
5.根據(jù)權(quán)利要求4所述的動(dòng)態(tài)探針方法,其特征在于所述動(dòng)態(tài)探針的插入位置包括程序的入口和出口處;和/或基本塊的入口和出口處;和/或轉(zhuǎn)移指令之前;和/或標(biāo)號語句之前。
6.根據(jù)權(quán)利要求5所述的動(dòng)態(tài)探針方法,其特征在于還通過動(dòng)態(tài)探針框架獲取詳細(xì)的性能數(shù)據(jù),所述動(dòng)態(tài)探針框架包括動(dòng)態(tài)探針管理器和動(dòng)態(tài)探針事件處理器,所述動(dòng)態(tài)探針管理器負(fù)責(zé)接受探針的注冊或者注銷請求,并將每一個(gè)探針定義保存到動(dòng)態(tài)探針對象中,所述動(dòng)態(tài)探針事件處理器包含當(dāng)激活探針時(shí)需要執(zhí)行的具體指令,完成對斷點(diǎn)中斷的具體響應(yīng)。
7.一種動(dòng)態(tài)探針方法在嵌入式系統(tǒng)中的應(yīng)用,其特征在于在嵌入式系統(tǒng)的被測程序運(yùn)行時(shí),采用斷點(diǎn)機(jī)制將探針插入到被測程序例程,以無干擾地收集嵌入式系統(tǒng)的詳細(xì)性能信息。
8.根據(jù)權(quán)利要求7所述的動(dòng)態(tài)探針方法在嵌入式系統(tǒng)中的應(yīng)用,其特征在于所述收集嵌入式系統(tǒng)的詳細(xì)性能信息通過由探針對被測程序運(yùn)行時(shí)的相關(guān)信息進(jìn)行探測所實(shí)現(xiàn)。
9.根據(jù)權(quán)利要求7或8所述的動(dòng)態(tài)探針方法在嵌入式系統(tǒng)中的應(yīng)用,其特征在于該應(yīng)用過程包括(1)指令替換技術(shù),包括插入斷點(diǎn)、監(jiān)控上下文信息、當(dāng)斷點(diǎn)被觸發(fā)的時(shí)候轉(zhuǎn)儲(chǔ)特定的數(shù)據(jù)區(qū);(2)動(dòng)態(tài)探針的插樁策略,即動(dòng)態(tài)探針插入的位置,所述插樁策略包括函數(shù)探針、基本塊探針、分支探針、斷言探針、時(shí)間探針、變量跟蹤探針和系統(tǒng)信息跟蹤探針;(3)動(dòng)態(tài)探針的類型,包括跟應(yīng)用程序信息相關(guān)的動(dòng)態(tài)探針,以及跟探測系統(tǒng)信息相關(guān)的動(dòng)態(tài)探針。
全文摘要
本發(fā)明提供一種動(dòng)態(tài)探針方法及其在嵌入式系統(tǒng)中的應(yīng)用,在被測程序運(yùn)行時(shí)采用斷點(diǎn)機(jī)制將探針插入到被測程序中;具體實(shí)現(xiàn)過程為首先確定探針的插入位置,在插入位置處用探針調(diào)用指令替換原有的指令,然后執(zhí)行探針指令,等待探針動(dòng)作完成之后,再執(zhí)行插入位置處的原指令。在嵌入式系統(tǒng)應(yīng)用時(shí),嵌入式系統(tǒng)的被測程序運(yùn)行時(shí),采用斷點(diǎn)機(jī)制將探針插入到被測程序例程,以無干擾地收集嵌入式系統(tǒng)的詳細(xì)性能信息。對比現(xiàn)有嵌入式性能分析工具的數(shù)據(jù)采集方法,本發(fā)明所述的嵌入式動(dòng)態(tài)探針的最顯著特色是數(shù)據(jù)動(dòng)態(tài)收集,而且靈活性高,方法簡便,易于實(shí)現(xiàn)。實(shí)驗(yàn)結(jié)果表明,采用嵌入式動(dòng)態(tài)探針收集的數(shù)據(jù)正確性、準(zhǔn)確性和完備性都較好。
文檔編號G06F11/36GK101067798SQ200710028580
公開日2007年11月7日 申請日期2007年6月14日 優(yōu)先權(quán)日2007年6月14日
發(fā)明者劉發(fā)貴, 宋瀟豫, 吳慶波 申請人:華南理工大學(xué), 廣東美泰科技有限公司