debugging - 为什么 gdb 在我请求的写入后自动执行读取?

标签 debugging gdb rtems

我正在使用 gdb 通过自制的 gdb 服务器与基于 LEON2 的 ASIC 进行通信(尽管不确定“gdb 服务器”是这里的正确短语)。它的工作原理如下:gdb 客户端使用普通的 gdb 协议(protocol)与 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 协议(protocol),该行是预期的且正确的,即将 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 尝试读取该位置的原因的一种可能方法是设置 debug infrun 1。这将打印大量有关 GDB 本身正在尝试执行的操作的信息。

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

关于debugging - 为什么 gdb 在我请求的写入后自动执行读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27901689/

相关文章:

android - 编译器 Android Studio 中的错误?

c# - 是否可以在不中断调试的情况下在 Visual Studio 中查看执行函数列表?

c - R包: breakpoint setup for C function with gdb in Debian (Testing)

c - rtems中的简单字符设备

c++ - 为以太网适配器设置自定义 ip 时无法绑定(bind)套接字

c - 在rtems操作系统中解压tar.gz

php - 在项目级别而不是文件级别检查 php 中的语法错误

c++ - 调试会改变多线程 C++ 程序的行为吗?

c++ - 在 gdb 中跟踪对类实例/内存范围的写访问

c++ - Linux下捕获SIGKILL的调试程序