diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2011-02-21 14:59:31 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2011-02-21 14:59:31 +0000 |
commit | 2b9e872152e4d85fd7a8dd15cd8375ada410c5d8 (patch) | |
tree | caa25ab164892fd6d0c4acdd1b4bd0a3a305b163 /gdb/breakpoint.c | |
parent | 0bc3930dd359f4e7d15ef37e806d84719529a108 (diff) | |
download | gdb-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.c | 20 |
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; |