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.
This commit is contained in:
Pedro Alves
2011-08-09 16:21:18 +00:00
parent b5503c7b66
commit 9d8fa39233
5 changed files with 69 additions and 22 deletions

View File

@ -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