我正在使用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服务器:
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中是否有可以解释此行为的设置?
祝你好运
的Henrik
答案 0 :(得分:3)
在调试gdb服务器时,我可以看到它收到以下行
您不需要调试gdbserver。您只需打开GDB中的set debug remote 1
,然后让GDB打印所有已发送和已接收的数据包。
为什么gdb客户端试图从该地址读取?
有几种可能性:
0xABD37787
找出GDB尝试读取该位置的原因的一种可能方法是set debug infrun 1
。这将打印出许多关于GDB本身正在尝试做什么的信息。
另一种方法是调试GDB本身。在putpkt
上放置一个断点,当发送感兴趣的数据包时,检查堆栈跟踪以查看它的发送原因。