This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] PR python/11407


On 06/24/2010 07:10 PM, Tom Tromey wrote:
>>>>>> "Phil" == Phil Muldoon <pmuldoon@redhat.com> writes:
> 
> Phil> This patch is for PR 11407. It also cures the ills in Jan's
> Phil> test-case from last night:
> 
> Phil> 2010-06-24  Phil Muldoon  <pmuldoon@redhat.com>
> Phil> 	PR python/11407
> Phil> 	* printcmd.c (print_variable_and_value): Print error message on
> Phil> 	caught exception.
> 
> This is ok with the changes Jan suggested.
> 
> I think the MI commands -stack-list-variables and friends will need
> similar treatment.  See mi-cmd-stack.c:list_args_or_locals.

Sorry for missing this, I was running 'info locals' in the MI
interpreter.  The MI -stack-list-locals case (as you noted) takes a
different direction from the CLI in printing these cases.

I'm not sure what to do in this case.  There seems to be no direct
equivalent of converting an exception to error output on a stream in MI
(or any cases of TRY ... exception handlers).  There are many cases of
MI raising an error() though, so I thought it appropriate in our case
to raise a warning() instead.  Because of the peculiarities of the MI
cases I just report a warning generically and move on.  This is not
totally ideal, but it does allow the error/warning preamble followed
by the actual locals information.  IE in my case:

(.. lots and lots of error messages for the Python testcase and ...)

~"RuntimeError: Cannot access memory at address 0x6c756d702f656d57\n"
~"Traceback (most recent call last):\n"
~"  File \"/home/pmuldoon/git/stack-list-locals/printers.py\", line 549, in to_string\n"
~"    return self.val['_M_dataplus']['_M_p'].lazy_string (length = len)\n"
~"RuntimeError: Cannot access memory at address 0x6c2d6b6361747317\n"
&"warning: <error reading variable>\n"
&"warning: <error reading variable>\n"
^done,locals=[{name="mappedStrings"},{name="tmp"},{name="coll"},{name="str"},{name="stringV"},{name="derivedSet"},{name="stringVV"}]

Which ultimately I think the IDE people want on program
initialization (regardless of errors). At any rate, it is an
improvement over the direct termination at the first error (and no
locals=() data emitted). 


WDYT?

Cheers,

Phil

--

diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c
index 6797055..fe9fc81 100644
--- a/gdb/mi/mi-cmd-stack.c
+++ b/gdb/mi/mi-cmd-stack.c
@@ -31,7 +31,7 @@
 #include "gdb_string.h"
 #include "language.h"
 #include "valprint.h"
-
+#include "exceptions.h"
 
 enum what_to_list { locals, arguments, all };
 
@@ -335,27 +335,41 @@ list_args_or_locals (enum what_to_list what, int values, struct frame_info *fi)
                      && TYPE_CODE (type) != TYPE_CODE_UNION)
                    {
                      struct value_print_options opts;
+                     volatile struct gdb_exception except;
+
+                     TRY_CATCH (except, RETURN_MASK_ERROR)
+                       {
+
+                         val = read_var_value (sym2, fi);
+                         get_raw_print_options (&opts);
+                         opts.deref_ref = 1;
+                         common_val_print
+                           (val, stb->stream, 0, &opts,
+                            language_def (SYMBOL_LANGUAGE (sym2)));
+                       }
+                       if (except.reason < 0)
+                         warning (_("<error reading variable>"));
 
-                     val = read_var_value (sym2, fi);
-                     get_raw_print_options (&opts);
-                     opts.deref_ref = 1;
-                     common_val_print
-                       (val, stb->stream, 0, &opts,
-                        language_def (SYMBOL_LANGUAGE (sym2)));
                      ui_out_field_stream (uiout, "value", stb);
                    }
                  break;
                case PRINT_ALL_VALUES:
                  {
                    struct value_print_options opts;
+                   volatile struct gdb_exception except;
+                   
+                   TRY_CATCH (except, RETURN_MASK_ERROR)
+                     {
+                       val = read_var_value (sym2, fi);
+                       get_raw_print_options (&opts);
+                       opts.deref_ref = 1;
+                       common_val_print
+                         (val, stb->stream, 0, &opts,
+                          language_def (SYMBOL_LANGUAGE (sym2)));
+                     }
+                   if (except.reason < 0)
+                     warning (_("<error reading variable>"));
 
-                   val = read_var_value (sym2, fi);
-                   get_raw_print_options (&opts);
-                   opts.deref_ref = 1;
-                   common_val_print
-                     (val, stb->stream, 0, &opts,
-                      language_def (SYMBOL_LANGUAGE (sym2)));
-                   ui_out_field_stream (uiout, "value", stb);
                  }
                  break;
                }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]