From c709acd150761fffe3536bf9e6a0b32870f41ca3 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 2 Sep 2011 12:18:27 +0000 Subject: [PATCH] 2011-09-02 Pedro Alves gdb/ * 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. --- gdb/ChangeLog | 7 +++++++ gdb/infrun.c | 23 +++++++++++++++++++++++ gdb/value.c | 14 ++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index accaca302a3..376188fdf8f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2011-09-02 Pedro Alves + + * 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 Revert: diff --git a/gdb/infrun.c b/gdb/infrun.c index 27bd3d626af..6febe07301c 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 5a8cc1f2634..087cdfd5c25 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, _(""), ex.message); printf_filtered (("\n")); } if (!varseen) -- 2.30.2