gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 16 Jul 2012 19:15:39 +0000 (19:15 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Mon, 16 Jul 2012 19:15:39 +0000 (19:15 +0000)
PR 11914
* f-valprint.c (info_common_command): New variable frame_id.
Reinitialize FI form FRAME_ID after each print_variable_and_value.
* printcmd.c (print_variable_and_value): Extend function comment.
Add comment for invalidated FRAME.
* stack.c (backtrace_command_1): New variable frame_id.  Reinitialize
FI form FRAME_ID after each print_frame_local_vars.
(struct print_variable_and_value_data): Change frame to frame_id.
(do_print_variable_and_value): New variable frame, initialize it from
p->frame_id.  Add comment for invalidated FRAME.
(print_frame_local_vars, print_frame_arg_vars): New function comment.
Update CB_DATA.FRAME to CB_DATA.FRAME_ID initialization.  Add comment
for invalidated FRAME.

gdb/testsuite/
PR 11914
* gdb.python/py-prettyprint.c (eval_func, eval_sub): New.
(main): Call eval_sub.
* gdb.python/py-prettyprint.exp:
(python execfile ('py-prettyprint.py')): Move it earlier.
New breakpoint for eval-break.
(continue to breakpoint: eval-break, info locals): New test.
(python execfile ('py-prettyprint.py')): Move it from here.
* gdb.python/py-prettyprint.py (class pp_eval_type): New.
(register_pretty_printers): Register pp_eval_type.

gdb/ChangeLog
gdb/f-valprint.c
gdb/printcmd.c
gdb/stack.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-prettyprint.c
gdb/testsuite/gdb.python/py-prettyprint.exp
gdb/testsuite/gdb.python/py-prettyprint.py

index 717d5fd62a716c505265fceb277a742ad5b08552..45de32845353b66740b174855ff27eea620ac929 100644 (file)
@@ -1,3 +1,19 @@
+2012-07-16  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       PR 11914
+       * f-valprint.c (info_common_command): New variable frame_id.
+       Reinitialize FI form FRAME_ID after each print_variable_and_value.
+       * printcmd.c (print_variable_and_value): Extend function comment.
+       Add comment for invalidated FRAME.
+       * stack.c (backtrace_command_1): New variable frame_id.  Reinitialize
+       FI form FRAME_ID after each print_frame_local_vars.
+       (struct print_variable_and_value_data): Change frame to frame_id.
+       (do_print_variable_and_value): New variable frame, initialize it from
+       p->frame_id.  Add comment for invalidated FRAME.
+       (print_frame_local_vars, print_frame_arg_vars): New function comment.
+       Update CB_DATA.FRAME to CB_DATA.FRAME_ID initialization.  Add comment
+       for invalidated FRAME.
+
 2012-07-16  Marc Khouzam  <marc.khouzam@ericsson.com>
            Pedro Alves  <palves@redhat.com>
 
index 8b84b5aff6642028f4b2666939c51a1095b467d5..4359f6f62e9b4a45325f054e888a50aaeebbeea8 100644 (file)
@@ -505,6 +505,8 @@ info_common_command (char *comname, int from_tty)
 
   if (the_common)
     {
+      struct frame_id frame_id = get_frame_id (fi);
+
       if (strcmp (comname, BLANK_COMMON_NAME_LOCAL) == 0)
        printf_filtered (_("Contents of blank COMMON block:\n"));
       else
@@ -515,7 +517,18 @@ info_common_command (char *comname, int from_tty)
 
       while (entry != NULL)
        {
+         fi = frame_find_by_id (frame_id);
+         if (fi == NULL)
+           {
+             warning (_("Unable to restore previously selected frame."));
+             break;
+           }
+
          print_variable_and_value (NULL, entry->symbol, fi, gdb_stdout, 0);
+
+         /* print_variable_and_value invalidates FI.  */
+         fi = NULL;
+
          entry = entry->next;
        }
     }
index 2a0a8861cd42681d731f973d5056f06d370eb4ea..d5b5b63122a7d99f7c53e8cf187544eb3927aee0 100644 (file)
@@ -1961,7 +1961,9 @@ clear_dangling_display_expressions (struct so_list *solib)
    struct symbol.  NAME is the name to print; if NULL then VAR's print
    name will be used.  STREAM is the ui_file on which to print the
    value.  INDENT specifies the number of indent levels to print
-   before printing the variable name.  */
+   before printing the variable name.
+
+   This function invalidates FRAME.  */
 
 void
 print_variable_and_value (const char *name, struct symbol *var,
@@ -1983,6 +1985,10 @@ print_variable_and_value (const char *name, struct symbol *var,
       get_user_print_options (&opts);
       opts.deref_ref = 1;
       common_val_print (val, stream, indent, &opts, current_language);
+
+      /* common_val_print invalidates FRAME when a pretty printer calls inferior
+        function.  */
+      frame = NULL;
     }
   if (except.reason < 0)
     fprintf_filtered(stream, "<error reading variable %s (%s)>", name,
index 2520e2c36db0804a8aa7797aa0e25c15fa492b7a..35d379d55ec24e9561b7992ce8e0e2aea37790ff 100644 (file)
@@ -1727,7 +1727,20 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
          the frame->prev field gets set to NULL in that case).  */
       print_frame_info (fi, 1, LOCATION, 1);
       if (show_locals)
-       print_frame_local_vars (fi, 1, gdb_stdout);
+       {
+         struct frame_id frame_id = get_frame_id (fi);
+
+         print_frame_local_vars (fi, 1, gdb_stdout);
+
+         /* print_frame_local_vars invalidates FI.  */
+         fi = frame_find_by_id (frame_id);
+         if (fi == NULL)
+           {
+             trailing = NULL;
+             warning (_("Unable to restore previously selected frame."));
+             break;
+           }
+       }
 
       /* Save the last frame to check for error conditions.  */
       trailing = fi;
@@ -1919,7 +1932,7 @@ iterate_over_block_local_vars (struct block *block,
 
 struct print_variable_and_value_data
 {
-  struct frame_info *frame;
+  struct frame_id frame_id;
   int num_tabs;
   struct ui_file *stream;
   int values_printed;
@@ -1933,12 +1946,28 @@ do_print_variable_and_value (const char *print_name,
                             void *cb_data)
 {
   struct print_variable_and_value_data *p = cb_data;
+  struct frame_info *frame;
+
+  frame = frame_find_by_id (p->frame_id);
+  if (frame == NULL)
+    {
+      warning (_("Unable to restore previously selected frame."));
+      return;
+    }
+
+  print_variable_and_value (print_name, sym, frame, p->stream, p->num_tabs);
+
+  /* print_variable_and_value invalidates FRAME.  */
+  frame = NULL;
 
-  print_variable_and_value (print_name, sym,
-                           p->frame, p->stream, p->num_tabs);
   p->values_printed = 1;
 }
 
+/* Print all variables from the innermost up to the function block of FRAME.
+   Print them with values to STREAM indented by NUM_TABS.
+
+   This function will invalidate FRAME.  */
+
 static void
 print_frame_local_vars (struct frame_info *frame, int num_tabs,
                        struct ui_file *stream)
@@ -1961,7 +1990,7 @@ print_frame_local_vars (struct frame_info *frame, int num_tabs,
       return;
     }
 
-  cb_data.frame = frame;
+  cb_data.frame_id = get_frame_id (frame);
   cb_data.num_tabs = 4 * num_tabs;
   cb_data.stream = stream;
   cb_data.values_printed = 0;
@@ -1970,6 +1999,9 @@ print_frame_local_vars (struct frame_info *frame, int num_tabs,
                                 do_print_variable_and_value,
                                 &cb_data);
 
+  /* do_print_variable_and_value invalidates FRAME.  */
+  frame = NULL;
+
   if (!cb_data.values_printed)
     fprintf_filtered (stream, _("No locals.\n"));
 }
@@ -2016,6 +2048,11 @@ iterate_over_block_arg_vars (struct block *b,
     }
 }
 
+/* Print all argument variables of the function of FRAME.
+   Print them with values to STREAM.
+
+   This function will invalidate FRAME.  */
+
 static void
 print_frame_arg_vars (struct frame_info *frame, struct ui_file *stream)
 {
@@ -2036,7 +2073,7 @@ print_frame_arg_vars (struct frame_info *frame, struct ui_file *stream)
       return;
     }
 
-  cb_data.frame = frame;
+  cb_data.frame_id = get_frame_id (frame);
   cb_data.num_tabs = 0;
   cb_data.stream = gdb_stdout;
   cb_data.values_printed = 0;
@@ -2044,6 +2081,9 @@ print_frame_arg_vars (struct frame_info *frame, struct ui_file *stream)
   iterate_over_block_arg_vars (SYMBOL_BLOCK_VALUE (func),
                               do_print_variable_and_value, &cb_data);
 
+  /* do_print_variable_and_value invalidates FRAME.  */
+  frame = NULL;
+
   if (!cb_data.values_printed)
     fprintf_filtered (stream, _("No arguments.\n"));
 }
index 48287b1397247d3a4c96c152031f497135df1735..c6f5f6c019b28057704d47ad3435d438a0903044 100644 (file)
@@ -1,3 +1,16 @@
+2012-07-16  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       PR 11914
+       * gdb.python/py-prettyprint.c (eval_func, eval_sub): New.
+       (main): Call eval_sub.
+       * gdb.python/py-prettyprint.exp:
+       (python execfile ('py-prettyprint.py')): Move it earlier.
+       New breakpoint for eval-break.
+       (continue to breakpoint: eval-break, info locals): New test.
+       (python execfile ('py-prettyprint.py')): Move it from here.
+       * gdb.python/py-prettyprint.py (class pp_eval_type): New.
+       (register_pretty_printers): Register pp_eval_type.
+
 2012-07-15  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix a testcase regression by me.
index 0ff7b331daed71e963a8ea5b1ab6ac4e0dc79bea..1ff9e0511f0c890b4f48d6017eff95d946133d00 100644 (file)
@@ -219,6 +219,22 @@ struct nullstr
 struct string_repr string_1 = { { "one" } };
 struct string_repr string_2 = { { "two" } };
 
+static int
+eval_func (int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8)
+{
+  return p1;
+}
+
+static void
+eval_sub (void)
+{
+  struct eval_type_s { int x; } eval1 = { 1 }, eval2 = { 2 }, eval3 = { 3 },
+                               eval4 = { 4 }, eval5 = { 5 }, eval6 = { 6 },
+                               eval7 = { 7 }, eval8 = { 8 }, eval9 = { 9 };
+
+  eval1.x++; /* eval-break */
+}
+
 int
 main ()
 {
@@ -309,5 +325,7 @@ main ()
   
   nstype2 = nstype;
 
+  eval_sub ();
+
   return 0;      /* break to inspect struct and union */
 }
index a6c241a14118b13278d2e8d5801561540f1a0e4e..22af83c5905496dba71246a42a82cf233b44ea85 100644 (file)
@@ -123,14 +123,19 @@ if ![runto_main ] then {
     return
 }
 
-gdb_test "b [gdb_get_line_number {break to inspect} ${testfile}.c ]" \
-    ".*Breakpoint.*"
-gdb_test "continue" ".*Breakpoint.*"
-
 set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]
 
 gdb_test_no_output "python execfile ('${remote_python_file}')"
 
+gdb_breakpoint [gdb_get_line_number "eval-break"]
+gdb_continue_to_breakpoint "eval-break" ".* eval-break .*"
+
+gdb_test "info locals" "eval9 = eval=<123456789>"
+
+gdb_test "b [gdb_get_line_number {break to inspect} ${testfile}.c ]" \
+    ".*Breakpoint.*"
+gdb_test "continue" ".*Breakpoint.*"
+
 gdb_test "print ss" " = a=< a=<1> b=<$hex>> b=< a=<2> b=<$hex>>" \
     "print ss enabled #1"
 
index 52ffd1a100891636a6db9653149f4c429fe421b6..b02b90fe112ca625775057ad1b50382188a7ffdb 100644 (file)
@@ -199,6 +199,14 @@ class MemoryErrorString:
     def display_hint (self):
         return 'string'
 
+class pp_eval_type:
+    def __init__(self, val):
+        self.val = val
+
+    def to_string(self):
+       gdb.execute("bt", to_string=True)
+        return "eval=<" + str(gdb.parse_and_eval("eval_func (123456789, 2, 3, 4, 5, 6, 7, 8)")) + ">"
+
 def lookup_function (val):
     "Look-up and return a pretty-printer that can print val."
 
@@ -276,6 +284,8 @@ def register_pretty_printers ():
 
     pretty_printers_dict[re.compile ('^memory_error$')]  = MemoryErrorString
 
+    pretty_printers_dict[re.compile ('^eval_type_s$')] = pp_eval_type
+
 pretty_printers_dict = {}
 
 register_pretty_printers ()