[2/8] Fix follow-fork latent bug

Message ID 1491954673-29172-3-git-send-email-palves@redhat.com
State New, archived
Headers

Commit Message

Pedro Alves April 11, 2017, 11:51 p.m. UTC
  A later patch in the series adds an assertion to switch_to_thread that
the resulting inferior_ptid always matches the "current_inferior()"
inferior.  This exposed a latent bug in the follow-fork code, where
we're building the fork child inferior.  We're switching
inferior_ptid, but not the current inferior object...

gdb/ChangeLog:
yyyy-mm-dd  Pedro Alves  <palves@redhat.com>

	* infrun.c (follow_fork_inferior): Also switch the current
	inferior.
---
 gdb/infrun.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
  

Comments

Yao Qi April 13, 2017, 9:58 a.m. UTC | #1
Pedro Alves <palves@redhat.com> writes:

> -	  old_chain = save_inferior_ptid ();
> -	  save_current_program_space ();
> +	  old_chain = save_current_space_and_thread ();
>  
>  	  inferior_ptid = child_ptid;
>  	  add_thread (inferior_ptid);
> +	  set_current_inferior (child_inf);
>  	  child_inf->symfile_flags = SYMFILE_NO_READ;

Can we set up child thread_info inferior and pspace first, and then,
call switch_to_thread_no_regs to switch them in one go?

>  
>  	  /* If this is a vfork child, then the address-space is
> @@ -631,6 +631,7 @@ holding the child stopped.  Try \"set detach-on-fork\" or \
>  
>        inferior_ptid = child_ptid;
>        add_thread (inferior_ptid);
> +      set_current_inferior (child_inf);
  

Patch

diff --git a/gdb/infrun.c b/gdb/infrun.c
index b5eb4ab..c7298a3 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -498,11 +498,11 @@  holding the child stopped.  Try \"set detach-on-fork\" or \
 	  child_inf->gdbarch = parent_inf->gdbarch;
 	  copy_inferior_target_desc_info (child_inf, parent_inf);
 
-	  old_chain = save_inferior_ptid ();
-	  save_current_program_space ();
+	  old_chain = save_current_space_and_thread ();
 
 	  inferior_ptid = child_ptid;
 	  add_thread (inferior_ptid);
+	  set_current_inferior (child_inf);
 	  child_inf->symfile_flags = SYMFILE_NO_READ;
 
 	  /* If this is a vfork child, then the address-space is
@@ -631,6 +631,7 @@  holding the child stopped.  Try \"set detach-on-fork\" or \
 
       inferior_ptid = child_ptid;
       add_thread (inferior_ptid);
+      set_current_inferior (child_inf);
 
       /* If this is a vfork child, then the address-space is shared
 	 with the parent.  If we detached from the parent, then we can