This is the mail archive of the gdb@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]

Re: Restart remote application


On Wed, Aug 08, 2007 at 03:29:56PM +0200, Petr Koloros wrote:
> Hi all,
> 
> I'm having problems with restarting the remote application. Some time ago it
> was advised to use extended protocol and 'run' command but it doesn't work.

The extended protocol doesn't work very well.  I have a sketch for
improvements to running more than one remote application, and some
code, which I hope I'll be working on for the next release of GDB
after 6.7.  However, what you're describing here normally works.

Here's some bits of that code plus another related fix I noticed;
does it help for you?

-- 
Daniel Jacobowitz
CodeSourcery

2007-08-08  Daniel Jacobowitz  <dan@codesourcery.com>

	* remote.c (remote_wait, remote_async_wait): Stop if we receive
	an error.
	(extended_remote_mourn): Mourn the target and reset inferior_ptid.

	* linux-low.c (linux_kill): Clear the inferior list.
	(linux_detach): Clear the process list.

Index: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.265
diff -u -p -r1.265 remote.c
--- remote.c	3 Jul 2007 15:58:42 -0000	1.265
+++ remote.c	8 Aug 2007 14:21:59 -0000
@@ -3219,8 +3219,12 @@ remote_wait (ptid_t ptid, struct target_
       switch (buf[0])
 	{
 	case 'E':		/* Error of some sort.  */
+	  /* We're out of sync with the target now.  Did it continue or not?
+	     Not is more likely, so report a stop.  */
 	  warning (_("Remote failure reply: %s"), buf);
-	  continue;
+	  status->kind = TARGET_WAITKIND_STOPPED;
+	  status->value.sig = TARGET_SIGNAL_0;
+	  goto got_status;
 	case 'F':		/* File-I/O request.  */
 	  remote_fileio_request (buf);
 	  continue;
@@ -3432,8 +3436,12 @@ remote_async_wait (ptid_t ptid, struct t
       switch (buf[0])
 	{
 	case 'E':		/* Error of some sort.  */
+	  /* We're out of sync with the target now.  Did it continue or not?
+	     Not is more likely, so report a stop.  */
 	  warning (_("Remote failure reply: %s"), buf);
-	  continue;
+	  status->kind = TARGET_WAITKIND_STOPPED;
+	  status->value.sig = TARGET_SIGNAL_0;
+	  goto got_status;
 	case 'F':		/* File-I/O request.  */
 	  remote_fileio_request (buf);
 	  continue;
@@ -5135,14 +5143,16 @@ remote_async_mourn (void)
 static void
 extended_remote_mourn (void)
 {
-  /* We do _not_ want to mourn the target like this; this will
-     remove the extended remote target  from the target stack,
-     and the next time the user says "run" it'll fail.
+  /* Unlike "target remote", we do not want to unpush the target; then
+     the next time the user says "run", we won't be connected.  */
 
-     FIXME: What is the right thing to do here?  */
-#if 0
-  remote_mourn_1 (&extended_remote_ops);
-#endif
+  /* Call common code to mark the inferior as not running.  */
+  generic_mourn_inferior ();
+
+  /* Assume that the target has been restarted.  Set inferior_ptid
+     so that bits of core GDB realizes there's something here, e.g.,
+     so that the user can say "kill" again.  */
+  inferior_ptid = pid_to_ptid (MAGIC_NULL_PID);
 }
 
 /* Worker function for remote_mourn.  */
Index: gdbserver/linux-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-low.c,v
retrieving revision 1.59
diff -u -p -r1.59 linux-low.c
--- gdbserver/linux-low.c	2 Jul 2007 15:35:36 -0000	1.59
+++ gdbserver/linux-low.c	8 Aug 2007 14:21:59 -0000
@@ -280,6 +280,10 @@ linux_kill (void)
       /* Make sure it died.  The loop is most likely unnecessary.  */
       wstat = linux_wait_for_event (thread);
     } while (WIFSTOPPED (wstat));
+
+  clear_inferiors ();
+  free (all_processes.head);
+  all_processes.head = all_processes.tail = NULL;
 }
 
 static void
@@ -318,6 +322,8 @@ linux_detach (void)
   delete_all_breakpoints ();
   for_each_inferior (&all_threads, linux_detach_one_process);
   clear_inferiors ();
+  free (all_processes.head);
+  all_processes.head = all_processes.tail = NULL;
   return 0;
 }
 


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