2015-01-12 17 views
2

我使用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中的設置可以解釋此行爲?

問候

亨裏克

+0

這個地址是什麼?你的程序的入口點有一些機會? – dbrank0

+0

@ dbrank0 HW存儲器映射中不存在地址0xABD37787。 RAM從0x40000000變爲0x60000000。有些寄存器位於較高地址,但沒有位於地址0xA0020000之上。當我使用gdb時,沒有程序在運行。 CPU處於調試模式,gdb正在與LEON2 ASIC中的DSU(調試支持單元)交談,該ASIC可執行RAM和寄存器中的讀取和寫入操作。 – Sp4ceCoder

回答

3

在調試gdb的服務器,我可以看到,它接收以下行

你不必是調試gdbserver的。您可以簡單地在GDB中打開set debug remote 1,並讓GDB打印所有發送和接收的數據包。

爲什麼gdb客戶端試圖從該地址讀取?

有幾種可能性:

  • GDB認爲,程序計數器是目前0xABD37787
  • GDB認爲,需要設置一個斷點
  • GDB認爲,有一些數據它需要閱讀

一個可能的方法來弄清楚爲什麼GDB試圖讀取LO陽離子是set debug infrun 1。這將打印大量有關GDB本身嘗試執行的信息。

另一種方法是調試GDB本身。在putpkt上放置一個斷點,並在發送感興趣的數據包時,檢查堆棧跟蹤以瞭解其發送的原因。

+0

謝謝@僱主 - 俄羅斯,這非常有幫助!通過使用列出的「set debug」命令,我發現gdb客戶端在連接到gdb服務器時請求通用寄存器的值(通過gdb協議中的'g'請求)。服務器發回很多寄存器值,例如寄存器O7中的內容。稍後,當gdb客戶端執行內存寫入操作時,它將通過讀取由O7值+8指出的地址開始。所以如果服務器說O7包含0xABD3777F,那麼在寫入內存之前,gdb將讀取0xABD37787。 – Sp4ceCoder

+0

地址O7 + 8是SW的返回地址,但是當我運行gdb時,沒有SW正在運行,即O7寄存器可以包含任何內容。 當我啓動這個線程時,我說gdb在我寫入之後執行這個讀操作,但是看起來它發生在寫之前。 – Sp4ceCoder

+0

有沒有人知道爲什麼gdb在寫入內存之前讀取O7 + 8,或者如果這個 行爲可以改變? – Sp4ceCoder

相關問題