[RFC] Bug in remote.c

Andrew Cagney ac131313@redhat.com
Thu Jun 12 14:47:00 GMT 2003


> While trying to get gdbserver working on FreeBSD, I discovered
> something that really smells like a bug in remote.c.

Yes.

> In remote_prepare_to_store() we have the following:
> 
>   /* Make sure the entire registers array is valid.  */
>   switch (remote_protocol_P.support)
>     {
>     case PACKET_DISABLE:
>     case PACKET_SUPPORT_UNKNOWN:
>       /* NOTE: This isn't rs->sizeof_g_packet because here, we are
>          forcing the register cache to read its and not the target
>          registers.  */
>       deprecated_read_register_bytes (0, (char *) NULL,
> 				      DEPRECATED_REGISTER_BYTES); /* OK */
> 
> Recently, Andrew has removed the need to set REGISTER_BYTES and turned
> it into DEPRECATED_REGISTER_BYTES.  On targets that don't set it,
> DEPRECATED_REGISTER_BYTES will be zero, which reduces this
> deprecated_read_register_bytes call to a no-op.  As a result GDB tries
> to write garbage into the registers on the remote target, and sooner
> or later things blow up in your face.
> 
> A possible solution would be to introduce a new function that
> completely fills the register cache upon request.  Comments?

I'd change it to:

	for (i = 0; i < NUM_REGS; i++)
	  if (...->in_g_packet)
	    regcache_raw_read (...);

which will ensure that all G packet registers are valid.

The sequence the code is trying to prevent is:

-> Continue
<- T<status>,R0=...,R1=...
	target stops returning a few registers
-> G.....
	the G packet won't be valid for all registers

If you're feeling adventerious you could persue:

- add an assert to regcache_collect checking that the collected register 
is valid (you need to be really adventerous here :-)

- probe for P-packet support before doing the read (but, off hand, I 
can't think of a register number that would be safe to probe :-/)

Andrew




More information about the Gdb-patches mailing list