diff options
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/infrun.c | 23 | ||||
-rw-r--r-- | gdb/value.c | 14 |
3 files changed, 42 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index accaca3..376188f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2011-09-02 Pedro Alves <pedro@codesourcery.com> + + * value.c (show_convenience): Catch errors thrown while printing + each internal variable. + * infrun.c (validate_siginfo_access): New function. + (siginfo_value_read, siginfo_value_write): Call it. + 2011-09-01 Jan Kratochvil <jan.kratochvil@redhat.com> Revert: diff --git a/gdb/infrun.c b/gdb/infrun.c index 27bd3d6..6febe07 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -6384,6 +6384,25 @@ signals_info (char *signum_exp, int from_tty) "to change these tables.\n")); } +/* Check if it makes sense to read $_siginfo from the current thread + at this point. If not, throw an error. */ + +static void +validate_siginfo_access (void) +{ + /* No current inferior, no siginfo. */ + if (ptid_equal (inferior_ptid, null_ptid)) + error (_("No thread selected.")); + + /* Don't try to read from a dead thread. */ + if (is_exited (inferior_ptid)) + error (_("The current thread has terminated")); + + /* ... or from a spinning thread. */ + if (is_running (inferior_ptid)) + error (_("Selected thread is running.")); +} + /* The $_siginfo convenience variable is a bit special. We don't know for sure the type of the value until we actually have a chance to fetch the data. The type can change depending on gdbarch, so it is @@ -6402,6 +6421,8 @@ siginfo_value_read (struct value *v) { LONGEST transferred; + validate_siginfo_access (); + transferred = target_read (¤t_target, TARGET_OBJECT_SIGNAL_INFO, NULL, @@ -6421,6 +6442,8 @@ siginfo_value_write (struct value *v, struct value *fromval) { LONGEST transferred; + validate_siginfo_access (); + transferred = target_write (¤t_target, TARGET_OBJECT_SIGNAL_INFO, NULL, diff --git a/gdb/value.c b/gdb/value.c index 5a8cc1f..087cdfd 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2095,13 +2095,23 @@ show_convenience (char *ignore, int from_tty) get_user_print_options (&opts); for (var = internalvars; var; var = var->next) { + volatile struct gdb_exception ex; + if (!varseen) { varseen = 1; } printf_filtered (("$%s = "), var->name); - value_print (value_of_internalvar (gdbarch, var), gdb_stdout, - &opts); + + TRY_CATCH (ex, RETURN_MASK_ERROR) + { + struct value *val; + + val = value_of_internalvar (gdbarch, var); + value_print (val, gdb_stdout, &opts); + } + if (ex.reason < 0) + fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message); printf_filtered (("\n")); } if (!varseen) |