Skip to content

Commit

Permalink
PR remote/18965: vforkdone stop reply should indicate parent PID
Browse files Browse the repository at this point in the history
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] riscvarchive#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.

Tests will be added later.

Tested on x86_64 Fedora 20.

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

	PR remote/18965
	* 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]>

	PR remote/18965
	* gdb.texinfo (Stop Reply Packets): Explain that vforkdone's 'r'
	part indicates the thread ID of the parent process.
  • Loading branch information
palves committed Sep 15, 2015
1 parent 7c5d0fa commit 8228463
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 15 deletions.
7 changes: 7 additions & 0 deletions gdb/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
2015-09-15 Pedro Alves <[email protected]>

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

2015-09-15 Yao Qi <[email protected]>

* aarch64-linux-nat.c (aarch64_linux_can_do_single_step): New
Expand Down
6 changes: 6 additions & 0 deletions gdb/doc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2015-09-15 Pedro Alves <[email protected]>

PR remote/18965
* gdb.texinfo (Stop Reply Packets): Explain that vforkdone's 'r'
part indicates the thread ID of the parent process.

2015-09-15 Yao Qi <[email protected]>

* gdb.texinfo (General Query Packets): Add vContSupported to
Expand Down
11 changes: 6 additions & 5 deletions gdb/doc/gdb.texinfo
Original file line number Diff line number Diff line change
Expand Up @@ -35498,11 +35498,12 @@ 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
applicable to targets that support vforkdone events.
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
did not support it. @value{GDBN} requests it, by supplying an
Expand Down
17 changes: 7 additions & 10 deletions gdb/gdbserver/remote-utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -1135,6 +1136,12 @@ prepare_resume_reply (char *buf, ptid_t ptid,
buf = write_ptid (buf, status->value.related_pid);
strcat (buf, ";");
}
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 && multi_process)
{
enum gdb_signal signal = GDB_SIGNAL_TRAP;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 8228463

Please sign in to comment.