Remove single-step breakpoint for GDBserver internal event
authorYao Qi <yao.qi@linaro.org>
Thu, 27 Oct 2016 15:05:06 +0000 (16:05 +0100)
committerYao Qi <yao.qi@linaro.org>
Thu, 27 Oct 2016 15:05:06 +0000 (16:05 +0100)
This patch removes single-step breakpoints if the event is only
GDBserver internal, IOW, isn't reported back to GDB.

gdb/gdbserver:

2016-10-27  Yao Qi  <yao.qi@linaro.org>

* linux-low.c (linux_wait_1): If single-step breakpoints are
inserted, remove them.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c

index 1a9c4e5f9d5b70b15efc0257c2b7016b5a01c59c..d43a96a0aee375ea26a1802547e5e36903b9dbce 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-27  Yao Qi  <yao.qi@linaro.org>
+
+       * linux-low.c (linux_wait_1): If single-step breakpoints are
+       inserted, remove them.
+
 2016-10-26  Pedro Alves  <palves@redhat.com>
 
        * linux-low.c (handle_extended_wait): Link parent/child fork
index f43ce7eccf67478cca5fd761e452b61053cd887a..a463774971bac7bcb5992e474ae9cc9c1c07f037 100644 (file)
@@ -3684,17 +3684,31 @@ linux_wait_1 (ptid_t ptid,
          (*the_low_target.set_pc) (regcache, event_child->stop_pc);
        }
 
-      /* We may have finished stepping over a breakpoint.  If so,
-        we've stopped and suspended all LWPs momentarily except the
-        stepping one.  This is where we resume them all again.  We're
-        going to keep waiting, so use proceed, which handles stepping
-        over the next breakpoint.  */
-      if (debug_threads)
-       debug_printf ("proceeding all threads.\n");
-
       if (step_over_finished)
-       unsuspend_all_lwps (event_child);
+       {
+         /* If we have finished stepping over a breakpoint, we've
+            stopped and suspended all LWPs momentarily except the
+            stepping one.  This is where we resume them all again.
+            We're going to keep waiting, so use proceed, which
+            handles stepping over the next breakpoint.  */
+         unsuspend_all_lwps (event_child);
+       }
+      else
+       {
+         /* Remove the single-step breakpoints if any.  Note that
+            there isn't single-step breakpoint if we finished stepping
+            over.  */
+         if (can_software_single_step ()
+             && has_single_step_breakpoints (current_thread))
+           {
+             stop_all_lwps (0, event_child);
+             delete_single_step_breakpoints (current_thread);
+             unstop_all_lwps (0, event_child);
+           }
+       }
 
+      if (debug_threads)
+       debug_printf ("proceeding all threads.\n");
       proceed_all_lwps ();
 
       if (debug_threads)