2009-01-01 Pedro Alves <pedro@codesourcery.com>
PR breakpoints/9681: * exceptions.h (enum errors): New error type, MEMORY_ERROR. * corefile.c (memory_error): Rewrite to throw a MEMORY_ERROR. * breakpoint.c (fetch_watchpoint_value): Ignore MEMORY_ERRORs, but retrow all other exceptions. 2009-01-01 Pedro Alves <pedro@codesourcery.com> PR breakpoints/9681: * gdb.base/watchpoint.exp: Add regression test.
This commit is contained in:
parent
023b0f5cef
commit
ccc57cf9e6
6 changed files with 60 additions and 20 deletions
|
@ -755,7 +755,7 @@ is_hardware_watchpoint (struct breakpoint *bpt)
|
|||
in *VAL_CHAIN. RESULTP and VAL_CHAIN may be NULL if the caller does
|
||||
not need them.
|
||||
|
||||
If an error occurs while evaluating the expression, *RESULTP will
|
||||
If a memory error occurs while evaluating the expression, *RESULTP will
|
||||
be set to NULL. *RESULTP may be a lazy value, if the result could
|
||||
not be read from memory. It is used to determine whether a value
|
||||
is user-specified (we should watch the whole value) or intermediate
|
||||
|
@ -776,6 +776,7 @@ fetch_watchpoint_value (struct expression *exp, struct value **valp,
|
|||
struct value **resultp, struct value **val_chain)
|
||||
{
|
||||
struct value *mark, *new_mark, *result;
|
||||
volatile struct gdb_exception ex;
|
||||
|
||||
*valp = NULL;
|
||||
if (resultp)
|
||||
|
@ -786,7 +787,26 @@ fetch_watchpoint_value (struct expression *exp, struct value **valp,
|
|||
/* Evaluate the expression. */
|
||||
mark = value_mark ();
|
||||
result = NULL;
|
||||
gdb_evaluate_expression (exp, &result);
|
||||
|
||||
TRY_CATCH (ex, RETURN_MASK_ALL)
|
||||
{
|
||||
result = evaluate_expression (exp);
|
||||
}
|
||||
if (ex.reason < 0)
|
||||
{
|
||||
/* Ignore memory errors, we want watchpoints pointing at
|
||||
inaccessible memory to still be created; otherwise, throw the
|
||||
error to some higher catcher. */
|
||||
switch (ex.error)
|
||||
{
|
||||
case MEMORY_ERROR:
|
||||
break;
|
||||
default:
|
||||
throw_exception (ex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
new_mark = value_mark ();
|
||||
if (mark == new_mark)
|
||||
return;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue