2011-09-02 Pedro Alves <pedro@codesourcery.com>
authorPedro Alves <palves@redhat.com>
Fri, 2 Sep 2011 12:18:27 +0000 (12:18 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 2 Sep 2011 12:18:27 +0000 (12:18 +0000)
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
gdb/infrun.c
gdb/value.c

index accaca3..376188f 100644 (file)
@@ -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:
 2011-09-01  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Revert:
index 27bd3d6..6febe07 100644 (file)
@@ -6384,6 +6384,25 @@ signals_info (char *signum_exp, int from_tty)
                     "to change these tables.\n"));
 }
 
                     "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
 /* 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;
 
 {
   LONGEST transferred;
 
+  validate_siginfo_access ();
+
   transferred =
     target_read (&current_target, TARGET_OBJECT_SIGNAL_INFO,
                 NULL,
   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;
 
 {
   LONGEST transferred;
 
+  validate_siginfo_access ();
+
   transferred = target_write (&current_target,
                              TARGET_OBJECT_SIGNAL_INFO,
                              NULL,
   transferred = target_write (&current_target,
                              TARGET_OBJECT_SIGNAL_INFO,
                              NULL,
index 5a8cc1f..087cdfd 100644 (file)
@@ -2095,13 +2095,23 @@ show_convenience (char *ignore, int from_tty)
   get_user_print_options (&opts);
   for (var = internalvars; var; var = var->next)
     {
   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);
       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)
       printf_filtered (("\n"));
     }
   if (!varseen)