2

我正在使用 gdb 通过自制的 gdb 服务器与基于 LEON2 的 ASIC 进行通信(不确定“gdb 服务器”是否是正确的短语)。它的工作原理是这样的:gdb 客户端使用普通的 gdb 协议与 gdb 服务器通信,然后 gdb 服务器将 gdb 请求转换为从/向硬件读取和写入,并将结果发送回客户端(如果有)。我的 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 中是否有可以解释这种行为的设置?

此致

亨里克

4

1 回答 1

3

在调试 gdb 服务器时,我可以看到它收到以下行

您不需要调试 gdbserver。您可以简单地set debug remote 1在 GDB 中打开,并让 GDB 打印所有发送和接收的数据包。

为什么 gdb 客户端试图从该地址读取?

有几种可能性:

  • GDB 认为程序计数器当前位于0xABD37787
  • GDB认为它需要在那里设置一个断点
  • GDB 认为有一些数据需要读取

找出 GDB 为何试图读取该位置的一种可能方法是set debug infrun 1. 这将打印很多关于 GDB 本身正在尝试做什么的信息。

另一种方法是调试 GDB 本身。在 上放置一个断点putpkt,当发送感兴趣的数据包时,检查堆栈跟踪以了解发送它的原因。

于 2015-01-14T05:13:45.137 回答