




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Translated By LinFangquan and KongLiGDB遠(yuǎn)程串行協(xié)議RSP是一系列的基于GNU的嵌入式開發(fā)系統(tǒng)的一部分,作者提出了他自己使用GDB遠(yuǎn)程地調(diào)試嵌入式應(yīng)用的一些論述。在9月份,我介紹了GDB。我論述了它的遠(yuǎn)程調(diào)試是如何能夠調(diào)試執(zhí)行在一個(gè)通過串口或者以太網(wǎng)或者其他方式連接到PC上的嵌入式系統(tǒng)上的代碼的。盡管也存在著具有這種能力的商業(yè)的產(chǎn)品,但是在我的心目中,免費(fèi)的GDB是一個(gè)很不錯(cuò)的解決方案,因?yàn)樗峁┝艘粋€(gè)輕型的、功能強(qiáng)大的調(diào)試器,它可以工作在嵌入式系統(tǒng)的廣大的范圍上,包括驅(qū)動(dòng)通訊接口或者資源受限無法得到一般商業(yè)化的產(chǎn)品的支持。在那篇文章我還提到了,為了實(shí)現(xiàn)遠(yuǎn)
2、程調(diào)試,gdb需要一個(gè)服務(wù)調(diào)試代理一個(gè)很小的代碼庫,它在被調(diào)試的目標(biāo)機(jī)器上管理寄存器和主存,通過通信鏈接響應(yīng)斷點(diǎn),向gdb報(bào)告應(yīng)用的狀態(tài)。那篇文章包括了SH-2微控制器的調(diào)試樁的一個(gè)摘要,但是我實(shí)際上在那里并沒有打算詳細(xì)地說明一個(gè)完整的調(diào)試樁是如何工作的。我將在本月的GDB RSPgdb的標(biāo)準(zhǔn)遠(yuǎn)程通信協(xié)議一文(本文)中詳細(xì)說明。如果你對(duì)于你的處理器處理斷點(diǎn)和其它事件很滿意,那么你需要掌握的全部知識(shí)是一些基本的RSP消息格式,它可以讓你的嵌入式系統(tǒng)和gdb對(duì)話。協(xié)議定義RSP是一種簡單的基于ASCII編碼的協(xié)議,它使用串口,局域網(wǎng)或者其它任何支持半雙工數(shù)據(jù)交換的通訊方式。RSP報(bào)文以一個(gè)美元符(
3、$)開頭,接著是若干個(gè)ASCII字節(jié)流,它們是消息的主體,最后以一個(gè)井號(hào)符(#)結(jié)束,兩個(gè)ASCII十六進(jìn)制的字符作為消息的校驗(yàn)和附在消息的后面。例如,下面是一個(gè)完整的RSP消息包:$m4015bc,2#5a接收者接到消息之后,立刻回復(fù)一條消息內(nèi)容為”+”或者“-”,以表示他正確無誤地收到消息(校驗(yàn)通過),或者接收失敗。一個(gè)典型的事件是,gdb給調(diào)試目標(biāo)發(fā)出調(diào)試命令,調(diào)試目標(biāo)接收消息,并返回一個(gè)簡單的確認(rèn)或者錯(cuò)誤碼。如果是后者被返回了,gdb將報(bào)告給使用者(程序員),并且暫停一切正在活動(dòng)的進(jìn)程??刂婆_(tái)輸出消息,調(diào)試目標(biāo)會(huì)輸出文本到gdb的控制臺(tái),輸出內(nèi)容是典型的命令-確認(rèn)信息的順序。除非當(dāng)另一
4、個(gè)命令已經(jīng)在執(zhí)行,否則這個(gè)消息可以在任何時(shí)候從調(diào)試樁發(fā)送到gdb。接下來的段落,描述了RSP若干常用命令。為了說明的需要,我將RSP消息分為三類:寄存器和主存相關(guān)的命令,程序控制命令和其它命令。寄存器和主存相關(guān)命令以下是讀寫寄存器的命令Read registers (“g”)Example: $g#67當(dāng)它想要知道調(diào)試目標(biāo)當(dāng)前寄存器的所有信息時(shí),gdb會(huì)發(fā)送這條命令。以下是一個(gè)目標(biāo)應(yīng)答消息的例子:+ $123456789abcdef0.#xx(0號(hào)寄存器(譯者按:32位寄存器)內(nèi)容為: 0 x12345678,1號(hào)寄存器內(nèi)容為: 0 x9abcdef0, 以此類推)這個(gè)應(yīng)答是一個(gè)有序的字節(jié)流,
5、它順序地指出了寄存器的數(shù)據(jù),按照目標(biāo)宏文件(gdb/config/tm-.h (例如, Hitachi SH的目標(biāo)宏文件gdb/config/sh/tm-sh.h))中定義的順序。Write registers (“G”)Example: $G123456789abcdef0.#xx(Set register 0 to x12345678, register1 to 0 x9abcdef0, 以此類推)這個(gè)消息是和讀寄存器命令互補(bǔ)的。通過這條命令,gdb提供了一個(gè)順序的字節(jié)流,它將要存儲(chǔ)到目標(biāo)處理機(jī)的寄存器中的數(shù)據(jù)在程序執(zhí)行中斷前立即寫入。一個(gè)應(yīng)答消息的例子:+ $OK#9aWrite reg
6、ister N (“P”)Example: $P10=0040149c#b3(Set register 10(注意是16進(jìn)制0 x10) to the value 0 x0040149c.)一個(gè)返回應(yīng)答:+ $OK#9a以下是讀寫主存的幾條命令。Read memory (“m”)Example: $m4015bc,2#5a (從地址0 x4015bc開始,讀兩個(gè)字節(jié)的內(nèi)容。)一個(gè)應(yīng)答消息示例:+ $2f86#06Write memory (“M”)Example: M4015cc,2:c320#6d(將長度為2個(gè)字節(jié)的0 xc320寫入主存0 x4015cc中)一個(gè)應(yīng)答消息示例:+ $OK#9
7、a程序控制命令程序控制命令是gdb用來控制目標(biāo)機(jī)被調(diào)試的應(yīng)用的行為的消息。這些命令要比上面講述的寄存器-主存控制命令要稍微復(fù)雜一些。Get last signal (“?”)Example: $?#3f這條命令用來找出目標(biāo)機(jī)是如何到達(dá)當(dāng)前狀態(tài)的。Step (“s”)Example: $s#73當(dāng)用戶發(fā)出單步調(diào)試Step命令時(shí),gdb向目標(biāo)機(jī)發(fā)送。Continue (“c”)Example: $c#63當(dāng)用戶發(fā)出Continue命令時(shí),gdb向目標(biāo)機(jī)發(fā)送?!癓ast signal” response (“S”)Example: $S05#b8Expedited response (“T”)Exa
8、mple: $T0510:1238;F:FFE0.#xx其它命令Console output (“O”)optionalExample:$O48656c6c6f2c20776f726c64210a#55(Prints “Hello, world!n” on the gdb console)其它命令控制臺(tái)輸出(”O(jiān)”)非強(qiáng)制的例:$048656c6c6f2c20776f726c64210a#55(在控制臺(tái)顯示“Hello World!n”) 這條命令讓gdb調(diào)試樁向gdb控制臺(tái)發(fā)送一個(gè)文本信息,這些顯示在控制臺(tái)上的符號(hào)對(duì)應(yīng)它們16進(jìn)制的ASCII碼(H=0 x48)。Gdb會(huì)連續(xù)接收信息直到遇見
9、換行符(n,0 x0a)。 這類信息一般是來源于目標(biāo)機(jī);gdb從不會(huì)向目標(biāo)機(jī)上發(fā)送控制臺(tái)輸出信息??枕憫?yīng)(” ”) 如果調(diào)試樁遇到不支持或無法識(shí)別的命令,它會(huì)返回一個(gè)空響應(yīng)。Gdb在接收到空響應(yīng)后,如果有相似的命令則會(huì)選擇相似命令。例:目標(biāo)機(jī)響應(yīng):+ $#00錯(cuò)誤響應(yīng)(”E”) 當(dāng)調(diào)試樁在命令執(zhí)行過程中遇到一個(gè)錯(cuò)誤時(shí),它必須向gdb返回一個(gè)錯(cuò)誤報(bào)告。在內(nèi)存操作中,總線錯(cuò)誤和/或非法地址就是典型的例子。此時(shí),調(diào)試樁會(huì)向gdb發(fā)送一個(gè)錯(cuò)誤報(bào)告。例:目標(biāo)機(jī)響應(yīng):+$E01#xx 并非所有錯(cuò)誤gdb都進(jìn)行過預(yù)定義;當(dāng)gdb接收到錯(cuò)誤報(bào)告時(shí),它將會(huì)把信息顯示在控制臺(tái)上并中斷正在執(zhí)行的操作??偨Y(jié) 現(xiàn)在,我
10、已經(jīng)將所有在嵌入式系統(tǒng)與gdb通信過程中所需要的基本知識(shí)分別介紹過了。在上一篇文章中,我介紹了陷阱報(bào)文,單步執(zhí)行和一些gdb特性;在上面的章節(jié)中,我還介紹了gdb與調(diào)試樁之間的通信協(xié)議?,F(xiàn)在我們要做的就是把和諧分立的信息總結(jié)在一起。 實(shí)際上,在真正開始調(diào)試前,我們還要解決一個(gè)次要問題:雞和蛋的問題,即在第一次通信時(shí)將調(diào)試樁下載進(jìn)嵌入式系統(tǒng)從而為以后建立通信打下基礎(chǔ)。 為了解決這個(gè)問題,可以有多種方法。對(duì)于我,最簡單的方法就是將最簡化的調(diào)試樁固化到目標(biāo)機(jī)上的非易失性存儲(chǔ)器中,用這些代碼啟動(dòng)嵌入式系統(tǒng)并協(xié)助下載余下的信息到RAM中。當(dāng)gdb啟動(dòng)應(yīng)用程序時(shí),gdb的控制命令傳輸?shù)降诙€(gè)與應(yīng)用程序本身
11、相連的調(diào)試樁。 這個(gè)方法的最大優(yōu)點(diǎn)在于,可以使用戶繼續(xù)改進(jìn)開發(fā)與應(yīng)用程序綁定的調(diào)試樁代碼,而不需要重新編輯在目標(biāo)機(jī)非易失性存儲(chǔ)器中的代碼,尤其是對(duì)于那些非易失性存儲(chǔ)器是一次性ROM的目標(biāo)機(jī)。另外,由于固化在目標(biāo)機(jī)上的調(diào)試樁代碼只包含最簡單的命令讀/寫內(nèi)存,寫寄存器和單步執(zhí)行等,在這一塊出現(xiàn)嚴(yán)重錯(cuò)誤的概率也會(huì)很低。 另一種方法是將整個(gè)調(diào)試樁固化到目標(biāo)機(jī)中并使用它執(zhí)行所有調(diào)試指令。這種方法不需要將目標(biāo)機(jī)應(yīng)用程序綁定一個(gè)調(diào)試樁。然而在固化程序出錯(cuò)或者要添加新的功能時(shí)就會(huì)顯示出起的缺點(diǎn)。 如果你使用的是商用的微處理器插板,你可能根部不需要自己編寫調(diào)試樁,因?yàn)間db本身已經(jīng)支持供應(yīng)商的標(biāo)準(zhǔn),或者你只要通
12、過串口分析工具為開發(fā)板提供支持gdb的環(huán)境。測試調(diào)試樁 如果你已經(jīng)有一個(gè)調(diào)試樁就緒,你必須在投入使用之前對(duì)其進(jìn)行測試。 下面是我推薦的一種測試流程。無論你什么時(shí)候?qū)φ{(diào)試樁進(jìn)行修改,記住要使它們實(shí)現(xiàn)所需的功能。 第一步,為了方便起見,將下面的內(nèi)容加入到你的gdbint文件中:set remotedebug 1set remotelogfile gdb_logfile這些命令讓gdb顯示宿主機(jī)和目標(biāo)機(jī)之間所有的RSP信息,并把它們記錄到文件gdb_logfile中。 第二步,將gdb與遠(yuǎn)程目標(biāo)相聯(lián),輸入命令“target remote port”。因?yàn)間db進(jìn)行連接,觀察兩者之間的交互信息以保證你
13、的調(diào)試樁能夠?qū)db的命令做出正確回應(yīng)。 在啟動(dòng)的過程中,你的調(diào)試樁需要將所有數(shù)據(jù)載入到每個(gè)處理器的寄存器中。使用gdb的” info registers”命令來保證gdb能夠正確的接收和顯示這些數(shù)據(jù)。 第三步,使用gdb的set命令來改變一些寄存器的值,保證調(diào)試樁既能準(zhǔn)確響應(yīng)write register命令,同時(shí)能在以后的read register命令中返回正確結(jié)果。 第四步,對(duì)內(nèi)存做相似的工作。舉個(gè)例子:print *(long*)0 x1234set *(long*)0 x1234=5678print *(long*)0 x1234 如果所有工作都能正常工作,你就可以試驗(yàn)gdb的load命令。這時(shí)控制臺(tái)上的顯示會(huì)非常雜亂無章,你需要借助log文件。一旦這一步完成,檢查一些內(nèi)存位置的值以保證有期望的數(shù)值。 如果你的調(diào)試樁支持控制臺(tái)輸出功能,那么你的測試要包含一些gdb控制臺(tái)輸出。在控制臺(tái)輸入continue,看輸出結(jié)果是否是你所期望的。 復(fù)位目標(biāo)平臺(tái),再裝入測試程序。在控制臺(tái)輸出命令前的一行設(shè)置斷點(diǎn)。再輸入continue,核實(shí)斷點(diǎn)是否在正確位置以及程序恢復(fù)后其輸出是否正確。 接著,重新載入測試程序,在次設(shè)置斷點(diǎn),設(shè)在有變量的行,檢查程序的變量變
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)村土地承包經(jīng)營權(quán)與農(nóng)村文化傳承保護(hù)合同
- 二零二五年度魚塘承包權(quán)及養(yǎng)殖技術(shù)培訓(xùn)轉(zhuǎn)讓合同
- Unit 3 Writing Home Lesson 15 Sending the Postcards同步練習(xí)(含答案含聽力原文無聽力音頻)
- Unit 1 Going to Beijing Lesson 6 Danny Is Lost!同步練習(xí)(含答案含聽力原文無音頻)
- 2025年度高端餐飲品牌區(qū)域代理權(quán)合作協(xié)議書
- 二零二五年度智能家居銷售總額提成及市場拓展合同
- 2025年巢湖b2貨運(yùn)上崗證模擬考試
- 在校實(shí)習(xí)生實(shí)習(xí)合同
- 2024年正規(guī)離婚協(xié)議
- 2025年遂寧年貨運(yùn)從業(yè)資格證考試題庫
- 湘科版科學(xué)(2017)六年級(jí)下冊3.4《多能源時(shí)代》課件
- GA 1383-2017報(bào)警運(yùn)營服務(wù)規(guī)范
- 資料交接移交確認(rèn)單
- 2023年青島恒星科技學(xué)院單招綜合素質(zhì)考試筆試題庫及答案解析
- 民族宗教新疆歷史課件
- 高低壓開關(guān)柜安裝檢驗(yàn)記錄
- 部編語文八年級(jí)上冊1-3單元教材分析課件
- (完整版)SF-36評(píng)分標(biāo)準(zhǔn)
- 研究思路圖模板
- 職員員工行為規(guī)范檢查表
- 一級(jí)公司向二級(jí)公司授權(quán)管理制度
評(píng)論
0/150
提交評(píng)論