diff --git a/gdb/infrun.c b/gdb/infrun.c index cc2a4bcf515..45c1b4a79bb 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -1105,13 +1105,19 @@ handle_vfork_child_exec_or_exit (int exec) go ahead and create a new one for this exiting inferior. */ - /* Switch to no-thread while running clone_program_space, so - that clone_program_space doesn't want to read the - selected frame of a dead process. */ scoped_restore_current_thread restore_thread; - switch_to_no_thread (); - inf->pspace = new program_space (maybe_new_address_space ()); + /* Temporarily switch to the vfork parent, to facilitate ptrace + calls done during maybe_new_address_space. */ + switch_to_thread (any_live_thread_of_inferior (vfork_parent)); + address_space_ref_ptr aspace = maybe_new_address_space (); + + /* Switch back to the vfork child inferior. Switch to no-thread + while running clone_program_space, so that clone_program_space + doesn't want to read the selected frame of a dead process. */ + switch_to_inferior_no_thread (inf); + + inf->pspace = new program_space (std::move (aspace)); inf->aspace = inf->pspace->aspace; set_current_program_space (inf->pspace); inf->removable = true; diff --git a/gdb/nat/ppc-linux.c b/gdb/nat/ppc-linux.c index 0957d1b58a7..74549754806 100644 --- a/gdb/nat/ppc-linux.c +++ b/gdb/nat/ppc-linux.c @@ -78,6 +78,8 @@ ppc64_64bit_inferior_p (long msr) int ppc_linux_target_wordsize (int tid) { + gdb_assert (tid != 0); + int wordsize = 4; /* Check for 64-bit inferior process. This is the case when the host is diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c index f34de9cb666..a63c25bf46a 100644 --- a/gdb/ppc-linux-nat.c +++ b/gdb/ppc-linux-nat.c @@ -1914,6 +1914,8 @@ ppc_linux_nat_target::auxv_parse (const gdb_byte **readptr, const gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) { + gdb_assert (inferior_ptid != null_ptid); + int tid = inferior_ptid.lwp (); if (tid == 0) tid = inferior_ptid.pid (); diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c index 0aa3edea8aa..e06e7e10b8c 100644 --- a/gdb/s390-linux-nat.c +++ b/gdb/s390-linux-nat.c @@ -949,10 +949,12 @@ s390_target_wordsize (void) /* Check for 64-bit inferior process. This is the case when the host is 64-bit, and in addition bit 32 of the PSW mask is set. */ #ifdef __s390x__ + int tid = s390_inferior_tid (); + gdb_assert (tid != 0); long pswm; errno = 0; - pswm = (long) ptrace (PTRACE_PEEKUSER, s390_inferior_tid (), PT_PSWMASK, 0); + pswm = (long) ptrace (PTRACE_PEEKUSER, tid, PT_PSWMASK, 0); if (errno == 0 && (pswm & 0x100000000ul) != 0) wordsize = 8; #endif @@ -965,6 +967,7 @@ s390_linux_nat_target::auxv_parse (const gdb_byte **readptr, const gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp) { + gdb_assert (inferior_ptid != null_ptid); int sizeof_auxv_field = s390_target_wordsize (); bfd_endian byte_order = gdbarch_byte_order (current_inferior ()->arch ()); const gdb_byte *ptr = *readptr;