2010-09-06 Yao Qi <yao@codesourcery.com>
authorYao Qi <yao@codesourcery.com>
Mon, 6 Sep 2010 13:10:28 +0000 (13:10 +0000)
committerYao Qi <yao@codesourcery.com>
Mon, 6 Sep 2010 13:10:28 +0000 (13:10 +0000)
* infrunc(resume): When inferior is waiting_for_vfork_done,
clear step and don't use displaced stepping.

gdb/ChangeLog
gdb/infrun.c

index f569efad71c0561513ce05da312c5271384c38fe..c7102765487b800c79108e0ac1ba313fe8d63ce4 100644 (file)
@@ -1,3 +1,8 @@
+2010-09-06  Yao Qi  <yao@codesourcery.com>
+
+       * infrunc(resume): When inferior is waiting_for_vfork_done,
+       clear step and don't use displaced stepping.
+
 2010-09-04  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * breakpoint.c (can_use_hardware_watchpoint): Handle the first
index 031544633e9e76b81508c2dde6ff9194c0d3f6b7..b21fd3f33e4aebc2da14c1b075afca905cb9cd40 100644 (file)
@@ -1560,6 +1560,19 @@ resume (int step, enum target_signal sig)
 
   QUIT;
 
+  /* Don't consider single-stepping when the inferior is 
+     waiting_for_vfork_done, either software or hardware step.  In
+     software step, child process will hit the software single step
+     breakpoint inserted in parent process.  In hardware step, GDB
+     can resumes inferior, and wait for vfork_done event.  */
+  if (current_inferior ()->waiting_for_vfork_done)
+    {
+      if (debug_infrun)
+       fprintf_unfiltered (gdb_stdlog,
+                           "infrun: resume : clear step\n");
+      step = 0;
+    }
+
   if (debug_infrun)
     fprintf_unfiltered (gdb_stdlog,
                         "infrun: resume (step=%d, signal=%d), "
@@ -1587,11 +1600,16 @@ a command like `return' or `jump' to continue execution."));
      We can't use displaced stepping when we have a signal to deliver;
      the comments for displaced_step_prepare explain why.  The
      comments in the handle_inferior event for dealing with 'random
-     signals' explain what we do instead.  */
+     signals' explain what we do instead.
+
+     We can't use displaced stepping when we are waiting for vfork_done
+     event, displaced stepping breaks the vfork child similarly as single
+     step software breakpoint.  */
   if (use_displaced_stepping (gdbarch)
       && (tp->trap_expected
          || (step && gdbarch_software_single_step_p (gdbarch)))
-      && sig == TARGET_SIGNAL_0)
+      && sig == TARGET_SIGNAL_0
+      && !current_inferior ()->waiting_for_vfork_done)
     {
       struct displaced_step_inferior_state *displaced;