aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2009-11-15 20:10:34 +0000
committerPedro Alves <palves@redhat.com>2009-11-15 20:10:34 +0000
commit678229626ec8f1a0d0d5c494335c05e9d0b52832 (patch)
tree50c327ad9c91dcaab7a2e4c49d4b57c31dc9deb2
parent56710373a0ab471d0891ad49b5c2a70f53cfc00d (diff)
downloadgdb-678229626ec8f1a0d0d5c494335c05e9d0b52832.zip
gdb-678229626ec8f1a0d0d5c494335c05e9d0b52832.tar.gz
gdb-678229626ec8f1a0d0d5c494335c05e9d0b52832.tar.bz2
* infrun.c (handle_inferior_event): When handling a fork or vfork
event, check if the bpstat causes a stop, instead of if it explains the signal. * breakpoint.c (bpstat_causes_stop): New. * breakpoint.h (bpstat_causes_stop): Declare.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/breakpoint.c10
-rw-r--r--gdb/breakpoint.h3
-rw-r--r--gdb/infrun.c6
4 files changed, 26 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 500eaf8..93fdd8c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2009-11-15 Pedro Alves <pedro@codesourcery.com>
+ * infrun.c (handle_inferior_event): When handling a fork or vfork
+ event, check if the bpstat causes a stop, instead of if it
+ explains the signal.
+ * breakpoint.c (bpstat_causes_stop): New.
+ * breakpoint.h (bpstat_causes_stop): Declare.
+
+2009-11-15 Pedro Alves <pedro@codesourcery.com>
+
* breakpoint.c (should_be_inserted): Don't insert breakpoints if
the pspace doesn't allow breakpoints.
(insert_breakpoint_locations): Remove waiting_for_vfork_done
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 0034338..c6140b0 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -3816,6 +3816,16 @@ bpstat_should_step (void)
return 0;
}
+int
+bpstat_causes_stop (bpstat bs)
+{
+ for (; bs != NULL; bs = bs->next)
+ if (bs->stop)
+ return 1;
+
+ return 0;
+}
+
static void print_breakpoint_location (struct breakpoint *b,
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index d23a852..91e864c 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -629,6 +629,9 @@ extern struct breakpoint *bpstat_find_step_resume_breakpoint (bpstat);
a watchpoint enabled. */
#define bpstat_explains_signal(bs) ((bs) != NULL)
+/* Nonzero is this bpstat causes a stop. */
+extern int bpstat_causes_stop (bpstat);
+
/* Nonzero if we should step constantly (e.g. watchpoints on machines
without hardware support). This isn't related to a specific bpstat,
just to things like whether watchpoints are set. */
diff --git a/gdb/infrun.c b/gdb/infrun.c
index c28366f..98e215c 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -2946,7 +2946,11 @@ handle_inferior_event (struct execution_control_state *ecs)
= bpstat_stop_status (get_regcache_aspace (get_current_regcache ()),
stop_pc, ecs->ptid);
- ecs->random_signal = !bpstat_explains_signal (ecs->event_thread->stop_bpstat);
+ /* Note that we're interested in knowing the bpstat actually
+ causes a stop, not just if it may explain the signal.
+ Software watchpoints, for example, always appear in the
+ bpstat. */
+ ecs->random_signal = !bpstat_causes_stop (ecs->event_thread->stop_bpstat);
/* If no catchpoint triggered for this, then keep going. */
if (ecs->random_signal)