summaryrefslogtreecommitdiff
path: root/gdb/printcmd.c
diff options
context:
space:
mode:
authorPedro Alves <pedro@codesourcery.com>2011-08-09 16:21:14 +0000
committerPedro Alves <pedro@codesourcery.com>2011-08-09 16:21:14 +0000
commit7f12503596efa58eba69329f2587592e1d9b0371 (patch)
tree3e5d3f3aa6a307a3e1241c93f3e29f16adfd6c5c /gdb/printcmd.c
parent821ed041d1dfad79215145c33f62106993b2e641 (diff)
downloadgdb-7f12503596efa58eba69329f2587592e1d9b0371.tar.gz
2011-08-09 Pedro Alves <pedro@codesourcery.com>
gdb/ * printcmd.c (current_display_number): Update comment. (disable_current_display_cleanup): Delete. (do_one_display): Use make_cleanup_restore_integer. Gracefully catch errors thrown while evaluating and printing the display. gdb/testsuite/ * gdb.base/display.c (do_loops): New `p_i' local. * gdb.base/display.exp: Test displaying a variable that is temporarily at a bad address.
Diffstat (limited to 'gdb/printcmd.c')
-rw-r--r--gdb/printcmd.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index f3765955f60..b09b4ea2ac9 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -129,7 +129,7 @@ show_print_symbol_filename (struct ui_file *file, int from_tty,
}
/* Number of auto-display expression currently being displayed.
- So that we can disable it if we get an error or a signal within it.
+ So that we can disable it if we get a signal within it.
-1 when not doing one. */
int current_display_number;
@@ -1656,14 +1656,6 @@ undisplay_command (char *args, int from_tty)
dont_repeat ();
}
-/* Cleanup that just disables the current display. */
-
-static void
-disable_current_display_cleanup (void *arg)
-{
- disable_current_display ();
-}
-
/* Display a single auto-display.
Do nothing if the display cannot be printed in the current context,
or if the display is disabled. */
@@ -1723,8 +1715,8 @@ do_one_display (struct display *d)
if (!within_current_scope)
return;
+ old_chain = make_cleanup_restore_integer (&current_display_number);
current_display_number = d->number;
- old_chain = make_cleanup (disable_current_display_cleanup, NULL);
annotate_display_begin ();
printf_filtered ("%d", d->number);
@@ -1732,8 +1724,7 @@ do_one_display (struct display *d)
printf_filtered (": ");
if (d->format.size)
{
- CORE_ADDR addr;
- struct value *val;
+ volatile struct gdb_exception ex;
annotate_display_format ();
@@ -1755,18 +1746,26 @@ do_one_display (struct display *d)
else
printf_filtered (" ");
- val = evaluate_expression (d->exp);
- addr = value_as_address (val);
- if (d->format.format == 'i')
- addr = gdbarch_addr_bits_remove (d->exp->gdbarch, addr);
-
annotate_display_value ();
- do_examine (d->format, d->exp->gdbarch, addr);
+ TRY_CATCH (ex, RETURN_MASK_ERROR)
+ {
+ struct value *val;
+ CORE_ADDR addr;
+
+ val = evaluate_expression (d->exp);
+ addr = value_as_address (val);
+ if (d->format.format == 'i')
+ addr = gdbarch_addr_bits_remove (d->exp->gdbarch, addr);
+ do_examine (d->format, d->exp->gdbarch, addr);
+ }
+ if (ex.reason < 0)
+ fprintf_filtered (gdb_stdout, _("<error: %s>\n"), ex.message);
}
else
{
struct value_print_options opts;
+ volatile struct gdb_exception ex;
annotate_display_format ();
@@ -1784,16 +1783,23 @@ do_one_display (struct display *d)
get_formatted_print_options (&opts, d->format.format);
opts.raw = d->format.raw;
- print_formatted (evaluate_expression (d->exp),
- d->format.size, &opts, gdb_stdout);
+
+ TRY_CATCH (ex, RETURN_MASK_ERROR)
+ {
+ struct value *val;
+
+ val = evaluate_expression (d->exp);
+ print_formatted (val, d->format.size, &opts, gdb_stdout);
+ }
+ if (ex.reason < 0)
+ fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
printf_filtered ("\n");
}
annotate_display_end ();
gdb_flush (gdb_stdout);
- discard_cleanups (old_chain);
- current_display_number = -1;
+ do_cleanups (old_chain);
}
/* Display all of the values on the auto-display chain which can be