summaryrefslogtreecommitdiff
path: root/gdb/breakpoint.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2011-02-21 14:59:31 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2011-02-21 14:59:31 +0000
commit2b9e872152e4d85fd7a8dd15cd8375ada410c5d8 (patch)
treecaa25ab164892fd6d0c4acdd1b4bd0a3a305b163 /gdb/breakpoint.c
parent0bc3930dd359f4e7d15ef37e806d84719529a108 (diff)
downloadgdb-2b9e872152e4d85fd7a8dd15cd8375ada410c5d8.tar.gz
* breakpoint.c (update_watchpoint): Do not attempt to recreate
per-frame locations while within a function epilogue.
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r--gdb/breakpoint.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index c9e149b656b..27fbcc674ba 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -1369,11 +1369,6 @@ update_watchpoint (struct breakpoint *b, int reparse)
if (!watchpoint_in_thread_scope (b))
return;
- /* We don't free locations. They are stored in the bp_location array
- and update_global_location_list will eventually delete them and
- remove breakpoints if needed. */
- b->loc = NULL;
-
if (b->disposition == disp_del_at_next_stop)
return;
@@ -1384,7 +1379,15 @@ update_watchpoint (struct breakpoint *b, int reparse)
within_current_scope = 1;
else
{
- struct frame_info *fi;
+ struct frame_info *fi = get_current_frame ();
+ struct gdbarch *frame_arch = get_frame_arch (fi);
+ CORE_ADDR frame_pc = get_frame_pc (fi);
+
+ /* If we're in a function epilogue, unwinding may not work
+ properly, so do not attempt to recreate locations at this
+ point. See similar comments in watchpoint_check. */
+ if (gdbarch_in_function_epilogue_p (frame_arch, frame_pc))
+ return;
/* Save the current frame's ID so we can restore it after
evaluating the watchpoint expression on its own frame. */
@@ -1400,6 +1403,11 @@ update_watchpoint (struct breakpoint *b, int reparse)
select_frame (fi);
}
+ /* We don't free locations. They are stored in the bp_location array
+ and update_global_location_list will eventually delete them and
+ remove breakpoints if needed. */
+ b->loc = NULL;
+
if (within_current_scope && reparse)
{
char *s;