aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2011-09-02 12:18:27 +0000
committerPedro Alves <palves@redhat.com>2011-09-02 12:18:27 +0000
commitc709acd150761fffe3536bf9e6a0b32870f41ca3 (patch)
tree14191338cf67ccd74fc3c6f324e6364179628fc8
parent86362dfd53fe65250e184a2bc443ea186a42f98f (diff)
downloadbinutils-c709acd150761fffe3536bf9e6a0b32870f41ca3.zip
binutils-c709acd150761fffe3536bf9e6a0b32870f41ca3.tar.gz
binutils-c709acd150761fffe3536bf9e6a0b32870f41ca3.tar.bz2
2011-09-02 Pedro Alves <pedro@codesourcery.com>
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.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/infrun.c23
-rw-r--r--gdb/value.c14
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 (&current_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 (&current_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)