This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb/gdb-7.11-branch] PR remote/19496, internal err forking-threads-plus-bkpt


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e993d610a980ea8df9200f158bfae69308c2138d

commit e993d610a980ea8df9200f158bfae69308c2138d
Author: Don Breazeal <donb@codesourcery.com>
Date:   Tue Feb 16 08:56:06 2016 -0800

    PR remote/19496, internal err forking-threads-plus-bkpt
    
    This patch fixes an internal error that occurs in
    gdb.threads/forking-threads-plus-breakpoint.exp:
    
    /blah/binutils-gdb/gdb/target.c:2723: internal-error: Can't determine the
    current address space of thread Thread 3170.3170
    
    In default_thread_address_space, find_inferior_ptid couldn't find 3170.3170
    because it had been overwritten in inferior_appeared, called as follows:
    
    inferior_appeared
      remote_add_inferior
        remote_notice_new_inferior
          remote_update_thread_list
    
    The cause of the problem was the following sequence of events:
    
    * GDB knows only about the main thread
    
    * the first fork event is reported to GDB, saved as pending_event
    
    * qXfer:threads:read gets the threads from the remote.
      remove_new_fork_children id's the fork child from the pending event
      and removes it from the list reported to GDB.  All the rest of the
      threads, including the fork parent, are added to the GDB thread list.
    
    * GDB stops all the threads.  All the stop events are pushed onto the
      stop reply queue behind the pending fork event.  The fork waitstatus
      is saved in the fork parent thread's pending status field
      thread_info.suspend.
    
    * remote_wait_ns calls queued_stop_reply and process_stop_reply to
      remove the fork event from the front of the stop reply queue and save
      event information in the thread_info structure for the fork parent
      thread.  Unfortunately, none of the information saved in this way is
      the fork-specific information.
    
    * A subsequent qXfer:threads:read packet gets the thread list including
      the fork parent and fork child.  remove_new_fork_children checks the
      thread list to see if there is a fork parent, doesn't find one, checks
      the stop reply queue for a pending fork event, doesn't find one, and
      allows the fork child thread to be reported to GDB before the fork
      event has been handled.  remote_update_thread_list calls
      remote_notice_new_thread and overwrites the current (main) thread in
      inferior_appeared.
    
    So the fork event has been reported out of target_wait but it was left
    pending on the infrun side (infrun.c:save_waitstatus).  IOW, the fork
    event hasn't been processed by handle_inferior_event yet, so it hasn't
    made it to tp->pending_follow yet.
    
    The fix is to check thread_info.suspend along with the
    thread_info.pending_follow in remote.c:remove_new_fork_children, to
    prevent premature reporting of the fork child thread creation.
    
    gdb/ChangeLog:
    
    	PR remote/19496
    	* remote.c (remove_new_fork_children): Check for pending
    	fork status in thread_info.suspend.
    
    gdb/testsuite/ChangeLog:
    
    	PR remote/19496
    	* gdb.threads/forking-threads-plus-breakpoint.exp (do_test):
    	Remove kfail for PR remote/19496.

Diff:
---
 gdb/ChangeLog                                                 | 6 ++++++
 gdb/remote.c                                                  | 7 ++++++-
 gdb/testsuite/ChangeLog                                       | 6 ++++++
 gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp | 6 ------
 4 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0f57e38..1b834eb 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2016-02-16  Don Breazeal  <donb@codesourcery.com>
+
+	PR remote/19496
+	* remote.c (remove_new_fork_children): Check for pending
+	fork status in thread_info.suspend.
+
 2016-02-16  Yao Qi  <yao.qi@linaro.org>
 
 	* arm-linux-tdep.c (arm_linux_software_single_step): Assign
diff --git a/gdb/remote.c b/gdb/remote.c
index 6d56f19..f09a06e 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -6166,7 +6166,12 @@ remove_new_fork_children (struct threads_listing_context *context)
      fork child threads from the CONTEXT list.  */
   ALL_NON_EXITED_THREADS (thread)
     {
-      struct target_waitstatus *ws = &thread->pending_follow;
+      struct target_waitstatus *ws;
+
+      if (thread->suspend.waitstatus_pending_p)
+	ws = &thread->suspend.waitstatus;
+      else
+	ws = &thread->pending_follow;
 
       if (is_pending_fork_parent (ws, pid, thread->ptid))
 	{
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 778adc0..b93096c 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-02-16  Don Breazeal  <donb@codesourcery.com>
+
+	PR remote/19496
+	* gdb.threads/forking-threads-plus-breakpoint.exp (do_test):
+	Remove kfail for PR remote/19496.
+
 2016-02-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
 	* gdb.arch/i386-prologue.c: Add missing prototypes.
diff --git a/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp b/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp
index 6c72061..ff3ca9a 100644
--- a/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp
+++ b/gdb/testsuite/gdb.threads/forking-threads-plus-breakpoint.exp
@@ -100,12 +100,6 @@ proc do_test { cond_bp_target detach_on_fork displaced } {
     set fork_count 0
     set ok 0
 
-    if {$displaced == "off"
-	&& [target_info exists gdb_protocol]
-	&& ([target_info gdb_protocol] == "remote"
-	    || [target_info gdb_protocol] == "extended-remote")} {
-	setup_kfail "remote/19496" *-*-*
-    }
     set test "inferior 1 exited"
     gdb_test_multiple "" $test {
 	-re "Inferior 1 \(\[^\r\n\]+\) exited normally" {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]