我使用gdb通過自制gdb服務器與基於LEON2的ASIC進行通信(不知道這個「gdb服務器」在這裏是否是正確的短語)。它的工作原理是這樣的:gdb客戶端使用普通的gdb協議與gdb服務器進行通信,gdb服務器然後將gdb請求轉換爲從HW讀寫數據,並將結果發送回客戶端(如果有的話)。我的gdb客戶端是在Windows 7 PC上的RTEMS 4.8.0中的sparc-rtems-gdb 6.6。爲什麼gdb在我要求的寫入後自動進行讀取?
當我開始gdb的客戶我運行下面的命令來連接到GDB服務器:
target extended-remote localhost:5000
然後我想換一個詞在RAM中,所以我運行這個gdb的命令:
set *((unsigned int*) 0x40000000)=2
在調試gdb服務器時,我可以看到它收到以下行,這是根據gdb協議預期並且正確的,即寫入4個字節,值2到地址0x40000000:
M40000000,4:00000002
現在,這樣的困惑:上面寫請求,另一個請求來自gdb的客戶端後,讀取地址0xABD37787 4個字節:
mabd37787,4
爲什麼GDB客戶端試圖從該地址讀?據我所知,我沒有做任何事情要求這個閱讀,我只想執行寫。如果gdb會讀回地址0x40000000,例如驗證寫入,那就沒問題。但是硬件地址0xABD37787不存在,這對我來說會造成問題。
有沒有什麼辦法可以調試gdb客戶端來確定它正在發送和接收的內容(以及爲什麼)?或者是否有gdb中的設置可以解釋此行爲?
問候
亨裏克
這個地址是什麼?你的程序的入口點有一些機會? – dbrank0
@ dbrank0 HW存儲器映射中不存在地址0xABD37787。 RAM從0x40000000變爲0x60000000。有些寄存器位於較高地址,但沒有位於地址0xA0020000之上。當我使用gdb時,沒有程序在運行。 CPU處於調試模式,gdb正在與LEON2 ASIC中的DSU(調試支持單元)交談,該ASIC可執行RAM和寄存器中的讀取和寫入操作。 – Sp4ceCoder