This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

fix gdbserver's infinite loop when something goes wrong, after something having gone wrong...


gdbserver can be caught in an infinite loop if something goes wrong
and longjmp's while detaching or killing all inferiors, just before
exiting.  In my case, I'm hacking a board file that runs the whole
testsuite in extended-remote mode against a local gdbserver, and I
had a several-gigabytes gdb.log file filled with:

	...
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
Couldn't write debug register
Detaching process(es): 22031
...

Obviously, detaching shouldn't have failed, but that's another story.

The patch below fixes it.

Note I'm thinking of making gdbserver also use gdb's exception/cleanup
mechanism at some point.

Tested on x86_64 GNU/Linux local gdbserver, and applied.

gdb/gdbserver/
2012-01-13  Pedro Alves  <palves@redhat.com>

	* server.c (main): Avoid infinite loop while detaching/killing
	after a longjmp.
---
 gdb/gdbserver/server.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index a3bc6c9..f312a5c 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -2719,6 +2719,16 @@ main (int argc, char *argv[])

   if (setjmp (toplevel))
     {
+      /* If something fails and longjmps while detaching or killing
+	 inferiors, we'd end up here again, stuck in an infinite loop
+	 trap.  Be sure that if that happens, we exit immediately
+	 instead.  */
+      if (setjmp (toplevel))
+	{
+	  fprintf (stderr, "Detach or kill failed.  Exiting\n");
+	  exit (1);
+	}
+
       detach_or_kill_for_exit ();
       exit (1);
     }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]