diff options
author | Tom Tromey <tromey@redhat.com> | 2013-08-02 16:41:08 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2013-08-02 16:41:08 +0000 |
commit | 3a1115a0cc0a0a98555ba99df76ad9bcfee08759 (patch) | |
tree | 7bd5d53c3fa5d8723edfa7193d43c3ec43f9d932 /gdb/breakpoint.c | |
parent | 58b19776a6713e101fb71fab79ea70fa9af19e3a (diff) | |
download | gdb-3a1115a0cc0a0a98555ba99df76ad9bcfee08759.zip gdb-3a1115a0cc0a0a98555ba99df76ad9bcfee08759.tar.gz gdb-3a1115a0cc0a0a98555ba99df76ad9bcfee08759.tar.bz2 |
fix PR symtab/15719
This patch fixes PR symtab/15719.
The bug is that "watch -location" crashes on a certain expression.
The problem is that fetch_subexp_value is catching an exception.
For ordinary watchpoints this is ok; but for location watchpoints,
it is better for the exception to propagate.
Built and regtested on x86-64 Fedora 18.
New test case included.
PR symtab/15719:
* breakpoint.c (update_watchpoint, watchpoint_check)
(watch_command_1): Update.
* eval.c (fetch_subexp_value): Add "preserve_errors"
parameter.
* ppc-linux-nat.c (check_condition): Update.
* value.h (fetch_subexp_value): Update.
* gdb.base/watchpoint.c (struct foo5): New.
(nullptr): New global.
* gdb.base/watchpoint.exp (test_watch_location): Add test.
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r-- | gdb/breakpoint.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 1e89407..eec7b7c 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1807,7 +1807,7 @@ update_watchpoint (struct watchpoint *b, int reparse) struct value *val_chain, *v, *result, *next; struct program_space *frame_pspace; - fetch_subexp_value (b->exp, &pc, &v, &result, &val_chain); + fetch_subexp_value (b->exp, &pc, &v, &result, &val_chain, 0); /* Avoid setting b->val if it's already set. The meaning of b->val is 'the last value' user saw, and we should update @@ -4822,7 +4822,7 @@ watchpoint_check (void *p) return WP_VALUE_CHANGED; mark = value_mark (); - fetch_subexp_value (b->exp, &pc, &new_val, NULL, NULL); + fetch_subexp_value (b->exp, &pc, &new_val, NULL, NULL, 0); /* We use value_equal_contents instead of value_equal because the latter coerces an array to a pointer, thus comparing just @@ -11010,7 +11010,7 @@ watch_command_1 (const char *arg, int accessflag, int from_tty, exp_valid_block = innermost_block; mark = value_mark (); - fetch_subexp_value (exp, &pc, &val, &result, NULL); + fetch_subexp_value (exp, &pc, &val, &result, NULL, just_location); if (just_location) { |