999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

嵌入式系統程序調用關系分析設計方法*

2010-04-26 05:08:10莊克良高云嶺紀向尚
艦船電子工程 2010年10期
關鍵詞:程序分析

莊克良 高云嶺 紀向尚

(海軍704廠 青島 266109)

1 引言

在嵌入式系統開發中,由于硬件資源受到功耗、體積、環境等因素的限制,此時程序的性能分析就顯得非常的重要,清晰的函數調用關系以及各函數的具體執行時間,可以有效的彌補硬件資源所帶來的缺憾。

嵌入式系統程序函數調用關系設計方法在不改變待分析程序源代碼的情況下,充分利用編譯器的編譯選項,簡化插入代碼的操作復雜度;然后,根據函數調用的規律進行函數入口地址的逆向追蹤,同時結合編譯中間文件,成功完成動態執行數據的函數名稱分析工作;最后,在開源工具Graphviz的幫助下完成樹狀圖的生成工作。

2 性能分析功能設計和實現原理

通過對程序的動態執行情況進行分析,獲取整個程序的函數調用層次關系以及執行時間情況。傳統的方法是通過手動在函數的進入處和退出處插入唯一的標記符號來實現。傳統方法不僅過程繁瑣,而且非常容易出錯。

嵌入式系統程序函數調用關系設計方法[4~5]充分利用Microsoft Visual C++Complier的編譯選項/Gh和/GH,通過這兩個附加鉤子函數的編譯選項,可以方便的把自定義的_penter和_pexit函數插入到每個函數的頭部和尾部。在UEFI的開發框架EDKII中,通過修改編譯工具鏈的局部配置文件,成功地解決編譯選項問題[1~3]。

為了捕獲并顯示函數動態執行的調用關系圖,需要充分利用四個主要的元素:MS Visual C++編譯工具鏈、編譯中間文件、自行設計的中間處理轉化代碼和一款開源工具 Graphviz。Microsoft Visual C++Complier編譯工具鏈主要是在程序預處理階段在函數首尾處插入自定義的鉤子函數;然后,對編譯中間文件進行分析,由程序的相對地址得到對應的函數名稱;接著,通過自行設計的中間轉化程序將獲得的動態執行情況和函數名稱進行映射,對臨時數據進行精簡處理,輸出符合DOT語法規范的輸入文件;最后Graphviz軟件將輸入文件轉化為直觀的樹狀結構圖。性能分析模塊處理流程框圖如圖1所示。

圖1 性能分析模塊處理流程框圖

3 性能分析功能詳細設計

3.1 添加編譯選項

Microsoft Visual C++Complier編譯工具鏈是支持鉤子函數編譯選項的先決條件。通過/Gh和/GH這兩個編譯選項能夠把自定義的_penter和_pexit函數插入到每個函數的頭部和尾部。

3.2 獲取父函數地址

針對IA-32架構函數調用過程中通過堆棧傳參的特點,對切換時堆棧的內容變化情況進行分析。在父函數按照cdecl約定調用子函數的時候,參數首先由右向左壓入堆棧,函數本身不清理堆棧,而是由調用者負責清理堆棧。由于參數按照從右向左順序壓棧,最開始的參數在最接近棧頂的位置。當采用不定數個數參數時,第一個參數在棧中的位置肯定能知道,只要不定的參數個數能夠根據第一個明確的參數確定下來,就可以使用不定參數。IA-32處理器架構堆棧切換對應關系如圖2所示。

圖2 IA-32處理器架構堆棧切換對應關系圖

3.3 獲取動態執行數據

保存動態數據的思想是,在插入函數的入口處將獲取的父函數地址記錄到文件中,同時壓入堆棧;在函數退出時,對堆棧執行出棧操作,并將函數出棧地址記錄到文件中。對于第一次插入和最后一次退出的特殊情況進行單獨處理,避免程序出現異常情況。

根據這個設計思想,插入函數偽代碼為:

3.4 獲取動態執行函數名稱

函數名在程序中實質上為該函數的函數指針。在程序的最終執行文件中,函數名字符串已經不存在了,取而代之的就是函數地址。因此獲取函數名稱只有在預處理階段獲得,充分利用編譯選項/Zd,即MAP文件,它表示在編譯的時候生成行信息。

在MAP文件中,關鍵信息的默認的基地址為0x00000000。該地址在.EFI程序加載到內存執行時,會根據當前硬件平臺的實際加載情況發生相應的變化,但load address與其它地址相對關系不會發生變化。這是通過分析MAP文件獲取函數名稱的理論基礎,同時MAP文件指定了程序的數據段、地址段和堆棧段的開始相對地址。

RVA(Relative Virtual Address):相對虛擬地址,表示程序可執行文件加載到實際執行內存中時,相對于基地址的偏移位置;

Base(Base Address):程序開始加載位置的基地址,這與開始處的perfferred load address相同。

RVA+Base:虛擬地址。

從MAP文件中,可以發現InitializeLs函數在理想虛擬地址0x00000260;MainProc函數在理想虛擬地址為0x00000310;Listing函數的虛擬地址為0x00000ab0;值得一提的是,通過/GH和/Gh插入的鉤子函數也在其中,函數頭部自動插入的函數名字為__penter,相對虛擬地址為0x000019b0;函數退出時自動插入的函數名字為__pexit,相對虛擬地址為0x00001d90。編譯產生MAP中間文件如圖3所示。

圖3 編譯產生MAP中間文件

3.5 精簡提取單元

在執行插入鉤子函數的應用程序時,會創建一個名為trace.txt的文本文件。該文件中包含了一系列地址信息:每行一個地址,每行都有一個前綴字符。如果前綴是E,那么這個地址就是一個函數的入口地址。如果前綴是一個X字符,那么這個地址就是一個出口地址。

因此,如果在跟蹤文件中有一個函數入口地址A緊跟著另外一個函數入口地址B,那么就可以推斷是函數A調用了函數B。如果一個函數入口地址A后面跟著一個函數出口地址A,那么就說明這個函數A被調用后就直接返回了。當涉及大量的調用鏈關系時,就很難分析究竟是誰調用了誰,因此,一種簡單的解決方案是維護一個存儲函數地址的堆棧。每次在跟蹤文件中碰到一個函數入口地址時,就將其壓入堆棧。棧頂的地址代表最后一次被調用的函數(也就是當前的活動函數)。如果后面緊接著是另外一個函數入口地址,這說明堆棧中的地址調用了這個剛從跟蹤文件處讀出的地址。在遇到退出函數時,當前的活動函數就會返回,并釋放棧頂元素。這會將當前上下文返到回前一個函數,由此,就可以產生正確的調用鏈過程。

圖4演示了這個原理以及精簡數據的方法。在分析跟蹤文件中的調用鏈時,會構建一個二維連通矩陣,用來表示哪個函數調用了其它哪些函數。這個矩陣的行表示調用函數的地址,列表示被調用函數的地址。對于每個調用對來說,行與列的交叉點不斷進行累加,就是調用次數。當處理完整個跟蹤文件時,其結果是應用程序的整個調用歷史的一個非常簡明的表示,同時包含了調用的次數。時間信息同樣被累加保存在行的函數屬性中,表示該函數在整個程序中總共占用的時間。

圖4 二維矩陣形式精簡數據過程圖

3.6 圖形化結果輸出

圖形化結果的輸出充分利用了開源工具Graphviz-2.20.3,Graphviz使用DOT(一種圖形描述語言)描述圖,通過解釋工具dot生成圖像文件,如圖5所示。

圖5 程序層次圖形文件輸出

4 應用前景

嵌入式系統程序函數調用關系設計方法完全通過編譯器的編譯選項和開源工具實現,設計中充分利用了編譯過程中產生的臨時數據文件。在分析過程中,對源程序不做任何改動,輸出的形式能夠直觀生動地反映當前程序動態執行過程中的具體調用關系和時間占用比率,對于程序的進一步優化作用是顯而易見的。

[1]Microsoft corporation.Visual C++MSDN[EB/OL].http://msdn.microsoft.com/zh-cn/library/c63a9b7h(VS.80).aspx,2008

[2]Framework Open Source Community.EFI_Shell_getting_Started_Guide.Version 0.31[EB/OL].https://efi-shell.tianocore.org/servlets/ProjectDocumentList,2005-06

[3]M.Tim Jones.Visualize function calls with Graphviz[EB/OL].http://www.ibm.com/developerworks/linux/library/l-graphvis,2005-06

[4]楊震倫.嵌入式操作系統及編程[M].北京:清華大學出版社,2009,5

[5]劉亞平.嵌入式系統及應用[M].北京:中國人民大學出版社,2009,1

猜你喜歡
程序分析
隱蔽失效適航要求符合性驗證分析
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
電力系統不平衡分析
電子制作(2018年18期)2018-11-14 01:48:24
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
電力系統及其自動化發展趨勢分析
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
中西醫結合治療抑郁癥100例分析
恐怖犯罪刑事訴訟程序的完善
主站蜘蛛池模板: 免费一级无码在线网站| 波多野结衣一区二区三区四区视频 | 欧美日韩国产系列在线观看| 国产成人a在线观看视频| 色婷婷综合激情视频免费看| 午夜小视频在线| 国产麻豆精品久久一二三| a网站在线观看| 女人18毛片一级毛片在线 | 久久久久国色AV免费观看性色| 刘亦菲一区二区在线观看| 成人综合网址| 成人午夜视频在线| 成人综合网址| 亚洲精品午夜天堂网页| 女高中生自慰污污网站| 成人国产精品视频频| 国产资源免费观看| 亚洲一区精品视频在线| 亚洲人成电影在线播放| 色综合久久无码网| 国产白丝av| 久久精品中文字幕少妇| 亚洲男人天堂2020| 国产一区二区在线视频观看| 欧美亚洲激情| 国产成人成人一区二区| 国产午夜一级淫片| 久草网视频在线| 国产尹人香蕉综合在线电影| 永久在线播放| 亚洲精品日产精品乱码不卡| 女人18毛片一级毛片在线| 久久精品国产亚洲麻豆| 国产精品99在线观看| 久久人人妻人人爽人人卡片av| 精品视频一区在线观看| 波多野吉衣一区二区三区av| 一本无码在线观看| 伊人久久大香线蕉综合影视| 九九热在线视频| 99热这里只有精品国产99| 国产成人艳妇AA视频在线| 国产成人AV综合久久| 亚洲视频免| 精品久久人人爽人人玩人人妻| 亚洲第一成年免费网站| 狼友视频国产精品首页| 国产毛片网站| 国产99在线观看| 成人一级黄色毛片| 亚洲V日韩V无码一区二区| 欧美在线国产| 日韩高清中文字幕| 欧美亚洲香蕉| 精品伊人久久久久7777人| 国产丝袜无码精品| 热久久这里是精品6免费观看| 欧美亚洲欧美区| 亚洲天堂精品视频| 婷婷在线网站| www精品久久| 99热这里只有精品免费国产| 亚洲欧洲AV一区二区三区| 91丝袜乱伦| 国产成人乱无码视频| 超清无码一区二区三区| 日韩乱码免费一区二区三区| 久久黄色小视频| 爱做久久久久久| 色噜噜在线观看| 国产原创演绎剧情有字幕的| 日韩欧美中文在线| 天天综合网色| 日本免费一级视频| 日韩精品亚洲人旧成在线| 久久香蕉国产线看观看亚洲片| av天堂最新版在线| 日韩av电影一区二区三区四区| 国产在线观看一区精品| a毛片在线播放| 67194亚洲无码|