为什么 gdb 在我请求写入后自动进行读取?

Why is gdb automatically doing a read after my requested write?

我正在使用 gdb 通过自制的 gdb 服务器与基于 LEON2 的 ASIC 进行通信(不确定 "gdb server" 是不是这里的正确短语)。它是这样工作的:gdb 客户端使用普通的 gdb 协议与 gdb 服务器通信,然后将 gdb 请求转换为读写 from/to 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 中是否有可以解释这种行为的设置?

此致

亨里克

While debugging the gdb server I can see that it receives the following line

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

Why is the gdb client trying to read from that address?

有几种可能:

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

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

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