gdb/hurd: handle inferiors exiting
authorAndrew Burgess <aburgess@redhat.com>
Thu, 6 Jan 2022 15:32:55 +0000 (15:32 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Sat, 8 Jan 2022 22:12:57 +0000 (22:12 +0000)
While testing on GNU/Hurd (i386) I noticed that GDB crashes when an
inferior exits, with this error:

  inferior.c:293: internal-error: inferior* find_inferior_pid(process_stratum_target*, int): Assertion `pid != 0' failed.

The problem appears to be in gnu_nat_target::wait.

We always set inferior_ptid to null_ptid before calling target_wait,
this has been the case since the multi-target changes were made to GDB
in commit:

  commit 5b6d1e4fa4fc6827c7b3f0e99ff120dfa14d65d2
  Date:   Fri Jan 10 20:06:08 2020 +0000

      Multi-target support

With follow up changes in commit:

  commit 24ed6739b699f329c2c45aedee5f8c7d2f54e493
  Date:   Thu Jan 30 14:35:40 2020 +0000

      gdb/remote: Restore support for 'S' stop reply packet

Unfortunately, the GNU/Hurd target is still relying on the value of
inferior_ptid in the case where an inferior exits - we return the
value of inferior_ptid as the pid of the process that exited.  This
was fine in the single target world, where inferior_ptid identified
the one running inferior, but this is no longer good enough.

Instead, we should return a ptid containing the pid of the process
that exited, as obtained from the wait event, and this is what this
commit does.

I've not run the full testsuite on GNU/Hurd as there appear to be lots
of other issues with this target that makes running the full testsuite
very painful, but I think this looks like a small easy improvement.

gdb/gnu-nat.c

index 1d3b5f1a357725b31f1d69aca8edf0036c139c83..9c53e3c0c2f408550f7929453cf5073fd7db74ef 100644 (file)
@@ -1603,7 +1603,10 @@ rewait:
                                                               available
                                                               thread.  */
       else
-       ptid = inferior_ptid;   /* let wait_for_inferior handle exit case */
+       {
+         /* The process exited. */
+         ptid = ptid_t (inf->pid);
+       }
     }
 
   if (thread