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:
parent
b5503c7b66
commit
9d8fa39233
@ -1,3 +1,10 @@
|
||||
2011-08-09 Pedro Alves <pedro@codesourcery.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2011-08-09 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* mi/mi-cmd-break.c (mi_cmd_break_passcount): Fix typo.
|
||||
|
@ -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 (¤t_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
|
||||
|
@ -1,3 +1,9 @@
|
||||
2011-08-09 Pedro Alves <pedro@codesourcery.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2011-08-08 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.dwarf2/dw2-op-stack-value.S: New file.
|
||||
|
@ -14,6 +14,8 @@ int do_loops()
|
||||
int k=0;
|
||||
int j=0;
|
||||
float f=3.1415;
|
||||
int *p_i = &i;
|
||||
|
||||
for( i = 0; i < LOOP; i++ ) { /* set breakpoint 1 here */
|
||||
for( j = 0; j < LOOP; j++ ) {
|
||||
for( k = 0; k < LOOP; k++ ) {
|
||||
|
@ -119,6 +119,32 @@ gdb_test "undisp" \
|
||||
"y"
|
||||
|
||||
|
||||
# Test displaying a variable that is temporarily at a bad address.
|
||||
# But if we can examine what's at memory address 0, then we'll also be
|
||||
# able to display it without error. Don't run the test in that case.
|
||||
set can_read_0 0
|
||||
gdb_test_multiple "x 0" "memory at address 0" {
|
||||
-re "0x0:.*Cannot access memory at address 0x0.*$gdb_prompt $" { }
|
||||
-re "0x0:.*Error accessing memory address 0x0.*$gdb_prompt $" { }
|
||||
-re ".*$gdb_prompt $" {
|
||||
set can_read_0 1
|
||||
}
|
||||
}
|
||||
|
||||
if { !$can_read_0 } {
|
||||
gdb_test "disp *p_i" ".*: \\*p_i = 0"
|
||||
gdb_test "p p_i = 0x0" " = \\(int \\*\\) 0x0"
|
||||
gdb_test "display" ".*: \\*p_i = <error: .*>" "display bad address"
|
||||
gdb_test "p p_i = &i" " = \\(int \\*\\) $hex"
|
||||
gdb_test "display" ".*: \\*p_i = 0" "display good address"
|
||||
|
||||
gdb_test "undisp" \
|
||||
"" \
|
||||
"undisp all again" \
|
||||
".*Delete all auto-display expressions.*y or n. $" \
|
||||
"y"
|
||||
}
|
||||
|
||||
gdb_test "disab 3" ".*.*" "disab 3"
|
||||
gdb_test "cont" ".*Breakpoint 4.*" "watch off"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user