Re: [commit] remote: make the whole connection setup exception safe

Pedro Alves
2008-10-10T14:54:35Z

[-- Attachment #1: Type: text/plain, Size: 659 bytes --]

Sorry, this broke `target extended-remote' if the stub reports that
it isn't controlling any process yet (gdbserver --multi). I missed
that there's a return statement in the middle of remote_start_remote,
which makes us not send '!' in that case.

remote_start_remote:
if (rs->buf[0] == 'W' || rs->buf[0] == 'X')
{
if (args->extended_p)
{
/* We're connected, but not running. Drop out before we
call start_remote. */
target_mark_exited (args->target);
return;
}

Fixed by just sending '!' earlier, like below. Checked in.

We should have a test for extended/persistent connections. Let me
cook something up.

--
Pedro Alves

[-- Attachment #2: extended.diff --]
[-- Type: text/x-diff, Size: 1325 bytes --]

2008-10-10 Pedro Alves <pedro@codesourcery.com>

gdb/
* remote.c (remote_start_remote): Always tell the stub if we're in
extended-remote.

---
gdb/remote.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)

Index: src/gdb/remote.c
===================================================================
--- src.orig/gdb/remote.c 2008-10-09 15:57:48.000000000 +0100
+++ src/gdb/remote.c 2008-10-10 14:58:30.000000000 +0100
@@ -2419,6 +2419,13 @@ remote_start_remote (struct ui_out *uiou
rs->noack_mode = 1;
}

+ if (args->extended_p)
+ {
+ /* Tell the remote that we are using the extended protocol. */
+ putpkt ("!");
+ getpkt (&rs->buf, &rs->buf_size, 0);
+ }
+
/* Next, if the target can specify a description, read it. We do
this before anything involving memory or registers. */
target_find_description ();
@@ -2482,13 +2489,6 @@ remote_start_remote (struct ui_out *uiou
immediate_quit--;
start_remote (args->from_tty); /* Initialize gdb process mechanisms. */

- if (args->extended_p)
- {
- /* Tell the remote that we are using the extended protocol. */
- putpkt ("!");
- getpkt (&rs->buf, &rs->buf_size, 0);
- }
-
/* If we connected to a live target, do some additional setup. */
if (target_has_execution)
{