diff options
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r-- | gdb/infrun.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c index cc2a4bc..45c1b4a 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; |