diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2018-07-03 19:02:48 +0100 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2018-08-06 08:49:39 +0100 |
commit | 953473375500a809fbb3eca3efa4dbb670c3a32f (patch) | |
tree | c1d2f82173e55b09761ad563a050ae1321bbee8b /gdb/linux-nat.c | |
parent | e968fc9b638e48a89e9a96804896c88a400e9be1 (diff) | |
download | gdb-953473375500a809fbb3eca3efa4dbb670c3a32f.zip gdb-953473375500a809fbb3eca3efa4dbb670c3a32f.tar.gz gdb-953473375500a809fbb3eca3efa4dbb670c3a32f.tar.bz2 |
gdb: Avoid using W_STOPCODE(0) as this is ambiguous on MIPS
The MIPS target supports 127 signals, and this can create an ambiguity
in process wait statuses. A status value of 0x007f could potentially
indicate a process that has exited with signal 127, or a process that
has stopped with signal 0.
In uClibc-ng the interpretation of 0x007f is that the process has
exited with signal 127 rather than stopped with signal 0, and so,
WIFSTOPPED (W_STOPCODE (0)) will be false rather than true as it would
be on most other platforms.
Given that it's pretty easy to avoid using W_STOPCODE (0), lets do that.
gdb/ChangeLog:
* linux-nat.c (linux_nat_target::follow_fork): Avoid using
'W_STOPCODE (0)' as this could be ambiguous.
Diffstat (limited to 'gdb/linux-nat.c')
-rw-r--r-- | gdb/linux-nat.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 86d3dfd..d2c88ad 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -445,7 +445,6 @@ linux_nat_target::follow_fork (int follow_child, int detach_fork) if (!follow_child) { struct lwp_info *child_lp = NULL; - int status = W_STOPCODE (0); int has_vforked; ptid_t parent_ptid, child_ptid; int parent_pid, child_pid; @@ -465,6 +464,8 @@ linux_nat_target::follow_fork (int follow_child, int detach_fork) /* Detach new forked process? */ if (detach_fork) { + int child_stop_signal = 0; + bool detach_child = true; struct cleanup *old_chain = make_cleanup (delete_lwp_cleanup, child_lp); @@ -484,18 +485,24 @@ linux_nat_target::follow_fork (int follow_child, int detach_fork) if (!gdbarch_software_single_step_p (target_thread_architecture (parent_ptid))) { + int status; + linux_disable_event_reporting (child_pid); if (ptrace (PTRACE_SINGLESTEP, child_pid, 0, 0) < 0) perror_with_name (_("Couldn't do single step")); if (my_waitpid (child_pid, &status, 0) < 0) perror_with_name (_("Couldn't wait vfork process")); + else + { + detach_child = WIFSTOPPED (status); + child_stop_signal = WSTOPSIG (status); + } } - if (WIFSTOPPED (status)) + if (detach_child) { - int signo; + int signo = child_stop_signal; - signo = WSTOPSIG (status); if (signo != 0 && !signal_pass_state (gdb_signal_from_host (signo))) signo = 0; |