gdbserver: fix silent error exit
authorPedro Alves <palves@redhat.com>
Thu, 6 Aug 2015 16:10:09 +0000 (17:10 +0100)
committerPedro Alves <palves@redhat.com>
Thu, 6 Aug 2015 16:10:09 +0000 (17:10 +0100)
Running gdb.threads/process-dies-while-handling-bp.exp against
gdbserver sometimes FAILs because GDBserver drops the connection, but
the logs leave no clue on what the reason could be.  Running manually
a few times, I saw the same:

 $  ./gdbserver/gdbserver --multi :9999 testsuite/gdb.threads/process-dies-while-handling-bp
 Process testsuite/gdb.threads/process-dies-while-handling-bp created; pid = 12766
 Listening on port 9999
 Remote debugging from host 127.0.0.1
 Listening on port 9999

 Child exited with status 0

 Child exited with status 0

What happened is that an exception escaped and gdbserver reopened the
connection, which led to that second "Listening on port 9999" output.

The error was a failure to access registers from a now-dead thread.
The exception probably shouldn't have escaped here, but meanwhile,
this at least makes the issue less mysterious.

Tested on x86_64 Fedora 20.

gdb/gdbserver/ChangeLog:
2015-08-06  Pedro Alves  <palves@redhat.com>

* server.c (captured_main): On error, print the exception message
to stderr, and if run_once is set, throw a quit.

gdb/gdbserver/ChangeLog
gdb/gdbserver/server.c

index fe31f731750756b9a51637091659180d66fd2bd6..1c1bb5eba0977060e3d628e3bb81d8455488a2ad 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-06  Pedro Alves  <palves@redhat.com>
+
+       * server.c (captured_main): On error, print the exception message
+       to stderr, and if run_once is set, throw a quit.
+
 2015-08-06  Pedro Alves  <palves@redhat.com>
 
        * linux-low.c (move_out_of_jump_pad_callback): Temporarily switch
index f15b7bedefa53343b1d290c9083ba8d48dedfd76..d3cc0f8487062610d7b3026ce7dea9a5ad2b317e 100644 (file)
@@ -3610,11 +3610,17 @@ captured_main (int argc, char *argv[])
        }
       CATCH (exception, RETURN_MASK_ERROR)
        {
+         fflush (stdout);
+         fprintf (stderr, "gdbserver: %s\n", exception.message);
+
          if (response_needed)
            {
              write_enn (own_buf);
              putpkt (own_buf);
            }
+
+         if (run_once)
+           throw_quit ("Quit");
        }
       END_CATCH
     }