專利名稱:在嵌入式系統(tǒng)模擬器上調(diào)試應(yīng)用程序的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機程序調(diào)試技術(shù),特別是在嵌入式系統(tǒng)模擬器上調(diào)試應(yīng)用程序的方法。
背景技術(shù):
隨著嵌入式設(shè)備普及,例如個人數(shù)字助手(PDA),手機等,基于便攜移動設(shè)備的應(yīng)用大量涌現(xiàn)。而嵌入式設(shè)備上的應(yīng)用程序一般都在與目標(biāo)平臺異構(gòu)的機器環(huán)境下開發(fā),不能在開發(fā)環(huán)境下調(diào)試,且嵌入式設(shè)備的開發(fā)評估的硬件仿真設(shè)備一般都比較昂貴,因此調(diào)試成為制約著嵌入式軟件開發(fā)的重要因素。
計算機系統(tǒng)模擬器技術(shù)是在某種架構(gòu)的計算機中通過模擬目標(biāo)架構(gòu)計算機的硬件特征和其指令執(zhí)行的過程,從而實現(xiàn)在一臺計算機上虛擬出多臺計算機的技術(shù)。流行的計算機系統(tǒng)模擬器例如Bochs,可以在多種體系結(jié)構(gòu)的機器上模擬多臺Intel 80×86體系的計算機,并運行Linux、freebsd等操作系統(tǒng)的Intel80×86版本;armulator,可以在Intel 80×86體系結(jié)構(gòu)的機器上模擬ARM體系的計算機,并運行ucLinux的ARM移植版本等。
利用計算機系統(tǒng)模擬器的特點,在模擬器上進行嵌入式軟件的調(diào)試成為解決嵌入式系統(tǒng)調(diào)試問題的一種解決方案,但是現(xiàn)有的基于模擬器的調(diào)試技術(shù)通常只能調(diào)試運行于嵌入式系統(tǒng)模擬器上的操作系統(tǒng),而對操作系統(tǒng)之上的應(yīng)用程序無能為力,這限制了基于模擬器調(diào)試技術(shù)發(fā)揮作用的空間;或者通過在操作系統(tǒng)上額外運行調(diào)試器,例如gdb,但如果在該操作系統(tǒng)上無可用的調(diào)試器(如ucLinux),則無法使用;或者在操作系統(tǒng)上運行調(diào)試器代理,例如gdb server,但要求模擬器支持虛擬的網(wǎng)絡(luò)連接同時操作系統(tǒng)必須實現(xiàn)TCP/IP等網(wǎng)絡(luò)協(xié)議棧,而這些要求許多嵌入式操作系統(tǒng)不能滿足,即時滿足,也增加了模擬器執(zhí)行的程序,影響模擬器性能。
進程是計算機程序執(zhí)行的基本單位,也是調(diào)試的基本單位。關(guān)于進程的基本信息都儲存在操作系統(tǒng)的進程控制塊結(jié)構(gòu)中,包括待調(diào)試進程的唯一標(biāo)識和進程的上下文信息(與CPU相關(guān)的狀態(tài),包括寄存器,頁表基址,段基址等)。因而透過模擬器上的操作系統(tǒng)調(diào)試應(yīng)用軟件的關(guān)鍵就在于獲得操作系統(tǒng)內(nèi)存空間中的進程控制塊信息。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種在嵌入式系統(tǒng)模擬器上調(diào)試應(yīng)用程序的方法。
本發(fā)明采用的技術(shù)方案是1)調(diào)試器使用者指定待調(diào)試應(yīng)用程序在模擬器上操作系統(tǒng)中的進程標(biāo)識號;2)符號分析加載模塊,對操作系統(tǒng)編譯時生成的內(nèi)核符號表進行掃描分析,得到進程控制塊結(jié)構(gòu)實例的內(nèi)存地址,并遍歷所有進程控制塊結(jié)構(gòu)實例,根據(jù)步驟1)中指定的進程標(biāo)識號取得待調(diào)試應(yīng)用程序的進程控制塊的內(nèi)存地址,根據(jù)操作系統(tǒng)支持虛地址與否,該內(nèi)存地址可能是虛擬地址,也可能是物理地址;3)虛擬內(nèi)存訪問模塊,如果操作系統(tǒng)支持虛地址機制,則該模塊實現(xiàn)與模擬器上運行的操作系統(tǒng)同樣的地址轉(zhuǎn)換算法,根據(jù)2)中獲得的虛地址計算出對應(yīng)的物理地址,如若遇見所對應(yīng)的內(nèi)存頁不在物理內(nèi)存中,則需將其從模擬文件系統(tǒng)中所在的塊號并將頁加載至內(nèi)存,若上層運行的操作系統(tǒng)不支持虛地址機制,則本步驟可以省去;4)調(diào)試接口模塊,該模塊接受來自程序開發(fā)人員的各種調(diào)試指令,送至調(diào)試代理模塊,并將調(diào)試代理模塊接受指令后產(chǎn)生的調(diào)試信息接受并顯示;5)調(diào)試代理模塊,該模塊收到調(diào)試接口傳來的調(diào)試指令,若調(diào)試指令為插入斷點,則將目的斷點地址對應(yīng)的指令修改為自行定義格式的斷點指令,被覆蓋的原指令連同斷點位置被保存下來,當(dāng)虛擬機遇到該斷點指令時,則停機等待從調(diào)試器發(fā)過來的調(diào)試指令;若調(diào)試指令為現(xiàn)場查詢指令或現(xiàn)場修改指令,則根據(jù)2)中獲得的進程控制塊中存儲的信息針對屬于進程的內(nèi)存地址或者由模擬器模擬的寄存器進行相應(yīng)的操作;若調(diào)試指令為繼續(xù)執(zhí)行,則將保存的原指令恢復(fù),讓虛擬機恢復(fù)運行狀態(tài);若為顯示進程列表指令,則調(diào)用符號分析加載模塊根據(jù)2)所述獲取進程列表數(shù)據(jù)結(jié)構(gòu)在內(nèi)核中的內(nèi)存地址,并遍歷該結(jié)構(gòu);若為指定調(diào)試進程指令,則在模擬器內(nèi)部維護一個當(dāng)前調(diào)試進程信息的數(shù)據(jù)結(jié)構(gòu)。
本發(fā)明和技術(shù)相比具有的有益的效果是其優(yōu)勢在于不需要操作系統(tǒng)的網(wǎng)絡(luò)支持,不需要運行額外的調(diào)試器程序,從而避免了嵌入式操作系統(tǒng)上缺乏調(diào)試器的問題;同時,本方法不在虛擬器的操作系統(tǒng)上執(zhí)行額外的程序,提高了模擬器的性能,改善響應(yīng)速度。
具體實施例方式
某ARM模擬器中,實現(xiàn)了對ARMv4版本指令的解釋執(zhí)行,模擬了Atmel公司AT91EV40開發(fā)板,在其上能夠運行ucLinux版本2.0.0。該版本ucLinux編譯時生成內(nèi)核符號文件為/boot/system.map。待調(diào)試的程序名假設(shè)為debuggedproc,調(diào)試器為debugger,模擬器名為simon,在模擬器中實現(xiàn)了符號分析加載模塊、虛擬內(nèi)存訪問模塊、調(diào)試代理模塊。同時在另外獨立運行的調(diào)試器客戶端中包含了調(diào)試接口模塊,該模塊和模擬器的調(diào)試代理模塊通過套接字進行通訊,通訊格式遵循GDB遠程調(diào)試協(xié)議。
1)調(diào)試器debugger通過符號分析加載模塊獲取的進程列表來確定待調(diào)試程序debuggedproc在目標(biāo)操作系統(tǒng)上的進程ID,假設(shè)為1000。此時,調(diào)試器可以通過attach 1000指令根據(jù)技術(shù)方案中1)所述指定待調(diào)試的進程ID。
2)符號分析加載模塊,對操作系統(tǒng)編譯時生成的內(nèi)核符號表system.map進行掃描分析,得到進程控制塊結(jié)構(gòu)數(shù)組task對應(yīng)的內(nèi)存地址,task數(shù)組中的項為進程控制塊結(jié)構(gòu),通過遍歷所有進程控制塊結(jié)構(gòu)實例,根據(jù)技術(shù)方案中1)中指定的進程標(biāo)識號取得待調(diào)試應(yīng)用程序的進程控制塊的內(nèi)存地址。根據(jù)操作系統(tǒng)支持虛地址與否,該內(nèi)存地址可能是虛擬地址,也可能是物理地址;3)虛擬內(nèi)存訪問模塊,如果操作系統(tǒng)支持虛地址機制,則該模塊實現(xiàn)與模擬器上運行的操作系統(tǒng)同樣的地址轉(zhuǎn)換算法,根據(jù)技術(shù)方案中1)中獲得的虛地址計算出對應(yīng)的物理地址,如若遇見所對應(yīng)的內(nèi)存頁不在物理內(nèi)存中,則需進一步解析進程控制塊結(jié)構(gòu)中的內(nèi)存數(shù)據(jù)結(jié)構(gòu)來獲取其在模擬文件系統(tǒng)或交換文件中所在的塊號并將頁加載至內(nèi)存;若上層運行的操作系統(tǒng)不支持虛地址機制,則本步驟可以省去;4)調(diào)試接口模塊,該模塊接受來自程序開發(fā)人員的各種調(diào)試指令(如顯示進程列表、指定調(diào)試進程、查看內(nèi)存、修改內(nèi)存、插入斷點、查看斷點、刪除斷點、查看寄存器、修改寄存器、單步執(zhí)行等),依據(jù)gdb遠程調(diào)試協(xié)議格式的要求解析出調(diào)試指令及其調(diào)試參數(shù)并送至調(diào)試代理模塊,并將調(diào)試代理模塊接受指令后產(chǎn)生的反饋調(diào)試信息接受并顯示;5)調(diào)試代理模塊,該模塊收到調(diào)試接口傳來的調(diào)試指令及其調(diào)試參數(shù),若調(diào)試指令為插入斷點,則將目的斷點地址對應(yīng)的指令修改為自行定義格式的斷點指令,被覆蓋的原指令連同斷點位置被保存下來,當(dāng)虛擬機遇到該指令時,則停機等待其它調(diào)試指令;若調(diào)試指令為現(xiàn)場查詢指令或現(xiàn)場修改類指令,則根據(jù)技術(shù)方案中2)中獲得的進程控制塊中存儲的信息針對屬于進程的內(nèi)存地址或者由模擬器模擬的寄存器進行相應(yīng)的操作;若調(diào)試指令為繼續(xù)執(zhí)行,則將保存的原指令恢復(fù),讓虛擬機恢復(fù)運行狀態(tài)。若為顯示進程列表指令,則調(diào)用符號分析加載模塊根據(jù)技術(shù)方案中2)所述獲取進程列表數(shù)據(jù)結(jié)構(gòu)在內(nèi)核中的內(nèi)存地址,并遍歷該結(jié)構(gòu)。若為指定調(diào)試進程指令,則在模擬器內(nèi)部維護一個當(dāng)前調(diào)試進程信息的數(shù)據(jù)結(jié)構(gòu)。
使用本方法不需要在ucLinux下運行額外的調(diào)試程序(例如GDB),也不要求該ucLinux實現(xiàn)TCP/IP協(xié)議,極大的減少了模擬器在解析這些程序或協(xié)議的指令時所造成的性能損耗。
權(quán)利要求
1 一種用在嵌入式系統(tǒng)模擬器上調(diào)試應(yīng)用程序的方法,其特征在于1)調(diào)試器使用者指定待調(diào)試應(yīng)用程序在模擬器上操作系統(tǒng)中的進程標(biāo)識號;2)符號分析加載模塊,對操作系統(tǒng)編譯時生成的內(nèi)核符號表進行掃描分析,得到進程控制塊結(jié)構(gòu)實例的內(nèi)存地址,并遍歷所有進程控制塊結(jié)構(gòu)實例,根據(jù)步驟1)中指定的進程標(biāo)識號取得待調(diào)試應(yīng)用程序的進程控制塊的內(nèi)存地址,根據(jù)操作系統(tǒng)支持虛地址與否,該內(nèi)存地址可能是虛擬地址,也可能是物理地址;3)虛擬內(nèi)存訪問模塊,如果操作系統(tǒng)支持虛地址機制,則該模塊實現(xiàn)與模擬器上運行的操作系統(tǒng)同樣的地址轉(zhuǎn)換算法,根據(jù)2)中獲得的虛地址計算出對應(yīng)的物理地址,如若遇見所對應(yīng)的內(nèi)存頁不在物理內(nèi)存中,則需將其從模擬文件系統(tǒng)中所在的塊號并將頁加載至內(nèi)存,若上層運行的操作系統(tǒng)不支持虛地址機制,則本步驟可以省去;4)調(diào)試接口模塊,該模塊接受來自程序開發(fā)人員的各種調(diào)試指令,送至調(diào)試代理模塊,并將調(diào)試代理模塊接受指令后產(chǎn)生的調(diào)試信息接受并顯示;5)調(diào)試代理模塊,該模塊收到調(diào)試接口傳來的調(diào)試指令,若調(diào)試指令為插入斷點,則將目的斷點地址對應(yīng)的指令修改為自行定義格式的斷點指令,被覆蓋的原指令連同斷點位置被保存下來,當(dāng)虛擬機遇到該斷點指令時,則停機等待從調(diào)試器發(fā)過來的調(diào)試指令;若調(diào)試指令為現(xiàn)場查詢指令或現(xiàn)場修改指令,則根據(jù)2)中獲得的進程控制塊中存儲的信息針對屬于進程的內(nèi)存地址或者由模擬器模擬的寄存器進行相應(yīng)的操作;若調(diào)試指令為繼續(xù)執(zhí)行,則將保存的原指令恢復(fù),讓虛擬機恢復(fù)運行狀態(tài);若為顯示進程列表指令,則調(diào)用符號分析加載模塊根據(jù)2)所述獲取進程列表數(shù)據(jù)結(jié)構(gòu)在內(nèi)核中的內(nèi)存地址,并遍歷該結(jié)構(gòu);若為指定調(diào)試進程指令,則在模擬器內(nèi)部維護一個當(dāng)前調(diào)試進程信息的數(shù)據(jù)結(jié)構(gòu)。
全文摘要
本發(fā)明公開了在嵌入式系統(tǒng)模擬器上調(diào)試應(yīng)用程序的方法。本發(fā)明的方法通過讀取操作系統(tǒng)編譯時生成的內(nèi)核符號文件,得到位于模擬器內(nèi)存中的應(yīng)用程序進程控制塊信息,從而獲得對應(yīng)用程序的控制能力,實現(xiàn)對運行于模擬器中操作系統(tǒng)之上的應(yīng)用程序的調(diào)試。其優(yōu)勢在于不需要操作系統(tǒng)的網(wǎng)絡(luò)支持,不需要運行額外的調(diào)試器程序,從而避免了嵌入式操作系統(tǒng)上缺乏調(diào)試器的問題;同時,本方法不在虛擬器的操作系統(tǒng)上執(zhí)行額外的程序,提高了模擬器的性能,改善響應(yīng)速度。
文檔編號G06F11/36GK1645339SQ200510049298
公開日2005年7月27日 申請日期2005年1月31日 優(yōu)先權(quán)日2005年1月31日
發(fā)明者卜佳俊, 陳純, 沈格俊, 趙軍, 柯化成 申請人:浙江大學(xué)