Re: problem with new vforkdone stop reply in 7.10

Pedro Alves <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <[email protected]>
On 09/15/2015 03:19 PM, Pedro Alves wrote:
> Hi Don,
> 
> Unfortunately, I missed in review that the vforkdone stop reply
> misses indicating the thread ID of the vfork parent which the
> event relates to:

I'm testing this.  I wonder whether I'm missing some reason
to keep the vforkdone switch case separate?
At least foll-vfork.exp still passes.

I should split this to a separate patch, but I also noticed that
the TARGET_WAITKIND_EXECD handling checks multi_process instead of
report_exec_events:

 -	else if (status->kind == TARGET_WAITKIND_EXECD && multi_process)
 +	else if (status->kind == TARGET_WAITKIND_EXECD && report_exec_events)

which I think would be the check we want.

Thanks,
Pedro Alves

From 85989d3ce1cc931aa7025e21952136ef037388a1 Mon Sep 17 00:00:00 2001
From: Pedro Alves <[email protected]>
Date: Tue, 15 Sep 2015 15:43:12 +0100
Subject: [PATCH] Fix vforkdone stop reply

The vforkdone stop reply misses indicating the thread ID of the vfork
parent which the event relates to:

 @cindex vfork events, remote reply
 @item vfork
 The packet indicates that @code{vfork} was called, and @var{r}
 is the thread ID of the new child process. Refer to
 @ref{thread-id syntax} for the format of the @var{thread-id}
 field.  This packet is only applicable to targets that support
 vfork events.

 @cindex vforkdone events, remote reply
 @item vforkdone
 The packet indicates that a child process created by a vfork
 has either called @code{exec} or terminated, so that the
 address spaces of the parent and child process are no longer
 shared. The @var{r} part is ignored.  This packet is only
 applicable to targets that support vforkdone events.

Unfortunately, this is not just a documentation issue.  GDBserver
is really not specifying the thread ID.  I noticed because
in non-stop mode, gdb complains:

 [Thread 6089.6089] #1 stopped.
 #0  0x0000003615a011f0 in ?? ()
 0x0000003615a011f0 in ?? ()
 (gdb) set debug remote 1
 (gdb) c
 Continuing.
 Sending packet: $QPassSignals:e;10;14;17;1a;1b;1c;21;24;25;2c;4c;#5f...Packet received: OK
 Sending packet: $vCont;c:p17c9.17c9#88...Packet received: OK
   Notification received: Stop:T05vfork:p17ce.17ce;06:40d7ffffff7f0000;07:30d7ffffff7f0000;10:e4c9eb1536000000;thread:p17c9.17c9;core:2;
 Sending packet: $vStopped#55...Packet received: OK
 Sending packet: $D;17ce#af...Packet received: OK
 Sending packet: $vCont;c:p17c9.17c9#88...Packet received: OK
   Notification received: Stop:T05vforkdone:;
 No process or thread specified in stop reply: T05vforkdone:;
 (gdb)

This is not non-stop-mode-specific, however.  Consider e.g., that in
all-stop, you may be debugging more than one process at the same time.
You continue, and both processes vfork.  So when you next get a
T05vforkdone, there's no way to tell which of the parent processes is
done with the vfork.

gdb/ChangeLog:
2015-09-15  Pedro Alves  <[email protected]>

	* remote-utils.c (prepare_resume_reply): Merge
	TARGET_WAITKIND_VFORK_DONE switch case with the
	TARGET_WAITKIND_FORKED case.

gdb/doc/ChangeLog:
2015-09-15  Pedro Alves  <[email protected]>

	* gdb.texinfo: Explain that vforkdone's 'r' part indicates the
	parent process.
---
 gdb/doc/gdb.texinfo          |  9 +++++----
 gdb/gdbserver/remote-utils.c | 19 ++++++++-----------
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 395f0d4..3ac8c43 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -35498,10 +35498,11 @@ indicating support.
 
 @cindex vforkdone events, remote reply
 @item vforkdone
-The packet indicates that a child process created by a vfork
-has either called @code{exec} or terminated, so that the
-address spaces of the parent and child process are no longer
-shared. The @var{r} part is ignored.  This packet is only
+The packet indicates that a child process created by a vfork has
+either called @code{exec} or terminated, so that the address spaces of
+the parent and child process are no longer shared. The @var{r} part is
+the thread ID of the parent process.  Refer to @ref{thread-id syntax}
+for the format of the @var{thread-id} field.  This packet is only
 applicable to targets that support vforkdone events.
 
 This packet should not be sent by default; older @value{GDBN} versions
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index ac86dd5..7cf66cc 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -1117,6 +1117,7 @@ prepare_resume_reply (char *buf, ptid_t ptid,
     case TARGET_WAITKIND_STOPPED:
     case TARGET_WAITKIND_FORKED:
     case TARGET_WAITKIND_VFORKED:
+    case TARGET_WAITKIND_VFORK_DONE:
     case TARGET_WAITKIND_EXECD:
       {
 	struct thread_info *saved_thread;
@@ -1135,7 +1136,13 @@ prepare_resume_reply (char *buf, ptid_t ptid,
 	    buf = write_ptid (buf, status->value.related_pid);
 	    strcat (buf, ";");
 	  }
-	else if (status->kind == TARGET_WAITKIND_EXECD && multi_process)
+	else if (status->kind == TARGET_WAITKIND_VFORK_DONE && report_vfork_events)
+	  {
+	    enum gdb_signal signal = GDB_SIGNAL_TRAP;
+
+	    sprintf (buf, "T%02xvforkdone:;", signal);
+	  }
+	else if (status->kind == TARGET_WAITKIND_EXECD && report_exec_events)
 	  {
 	    enum gdb_signal signal = GDB_SIGNAL_TRAP;
 	    const char *event = "exec";
@@ -1269,16 +1276,6 @@ prepare_resume_reply (char *buf, ptid_t ptid,
       else
 	sprintf (buf, "X%02x", status->value.sig);
       break;
-    case TARGET_WAITKIND_VFORK_DONE:
-      if (report_vfork_events)
-	{
-	  enum gdb_signal signal = GDB_SIGNAL_TRAP;
-
-	  sprintf (buf, "T%02xvforkdone:;", signal);
-	}
-      else
-	sprintf (buf, "T%02x", GDB_SIGNAL_0);
-      break;
     default:
       error ("unhandled waitkind");
       break;
-- 
1.9.3
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.