为什么 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
上放置一个断点,当发送感兴趣的数据包时,检查堆栈跟踪以查看发送它的原因。
我正在使用 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
上放置一个断点,当发送感兴趣的数据包时,检查堆栈跟踪以查看发送它的原因。