debugginggdbrtems

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


I'm using gdb to communicate with a LEON2-based ASIC through a home made gdb server (not sure though that "gdb server" is the correct phrase here). It works like this: the gdb client uses the ordinary gdb protocol to talk to the gdb server, which then translates the gdb requests to reads and writes from/to the HW and sends back the result to the client, if any. My gdb client is sparc-rtems-gdb 6.6 in RTEMS 4.8.0 on a Windows 7 PC.

When I start the gdb client I run the following command to attach to the gdb server:

target extended-remote localhost:5000

Then I want to change a word in RAM so I run this gdb command:

set *((unsigned int*) 0x40000000)=2

While debugging the gdb server I can see that it receives the following line, which is expected and correct according to the gdb protocol, i.e. writing 4 bytes, value 2 to address 0x40000000:

M40000000,4:00000002

Now the confusion: After the write request above, another request comes from the gdb client, read 4 bytes from address 0xABD37787:

mabd37787,4

Why is the gdb client trying to read from that address? As far as I know, I haven't done anything to request this read, I only wanted to perform the write. If gdb would have read back the address 0x40000000, for example to verify the write, it would be OK. But the out-of-nowhere-address 0xABD37787 does not exist on my HW, which causes problems for me.

Is there any way that I can debug the gdb client to determine exactly what (and why) it is sending and receiving? Or is there a setting in gdb that can explain this behaviour?

Best regards

Henrik


Solution

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

    You don't need to be debugging the gdbserver. You can simply turn on set debug remote 1 in GDB, and have GDB print all sent and received packets.

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

    There are several possibilities:

    One possible way to figure out why GDB is trying to read that location is to set debug infrun 1. This will print a lot of info about what GDB itself is trying to do.

    Another way is to debug GDB itself. Put a breakpoint on putpkt, and when the packet of interest is being sent, examine the stacktrace to see why it is being sent.