http://sourceware.org/ml/gdb-patches/2012-07/msg00551.html
authorAndrew Burgess <aburgess@broadcom.com>
Mon, 30 Jul 2012 12:10:23 +0000 (12:10 +0000)
committerAndrew Burgess <aburgess@broadcom.com>
Mon, 30 Jul 2012 12:10:23 +0000 (12:10 +0000)
Re-evaluate floating variables as part of variable invalidate to remove
references to type structures that might have been freed.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.mi/mi-var-invalidate.exp
gdb/varobj.c

index a89362b21618f99db10248553761d676656d636d..4e83c25973b26115b794223ca1ce41043324bab5 100644 (file)
@@ -1,3 +1,9 @@
+2012-07-30  Andrew Burgess  <aburgess@broadcom.com>
+
+       * varobj.c (varobj_invalidate_iter): All varobj must be marked as
+       invalid or reevaluated to prevent prevent references to possibly
+       delete'd type objects being left in the varobj.
+
 2012-07-27  Tom Tromey  <tromey@redhat.com>
            Jan Kratochvil  <jan.kratochvil@redhat.com>
 
index 137c2e7ef6d72a6872ff8f43f9efb1fb969bcbbc..42ae5c8408743ede553699b881156a849641653a 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-30  Andrew Burgess  <aburgess@broadcom.com>
+
+       * gdb.mi/mi-var-invalidate.exp: Create a floating variable and
+       change its format immediately after reloading the binary.
+
 2012-07-27  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix testsuite regression after --use-deprecated-index-sections removal.
index 3ecbbdf67d818f18b3b6e33ba2e09de24e6ca822..1f16f88253dcf91065851f8119ce7d576394d333 100644 (file)
@@ -61,6 +61,9 @@ mi_runto do_locals_tests
 # Desc: create local variables
 mi_create_varobj linteger linteger "create local variable linteger"
 
+# Desc: create floating variable
+mi_create_floating_varobj float_simple array "create floating variable"
+
 #
 # Reload the same binary.
 # Global variable should remain, local should be invalidated.
@@ -69,6 +72,12 @@ mi_delete_breakpoints
 mi_gdb_load ${binfile_bis}
 mi_runto main
 
+# Change format of floating variable immediately after reload reveals a
+# bug where gdb still uses a free'd pointer.
+mi_gdb_test "-var-set-format float_simple hexadecimal" \
+        "\\^done,format=\"hexadecimal\",value=\"\\\[-1\\\]\"" \
+       "set format variable float_simple"
+
 # Check local variable is "invalid".
 mi_gdb_test "-var-update linteger" \
        "\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"invalid\",has_more=\"0\"\}\\\]" \
index 99b158efcfd5d3c0822923271ebb7596bf6be1e9..a75a40da5720d707f4ccdad69ef5d13e754afc54 100644 (file)
@@ -4186,18 +4186,17 @@ _initialize_varobj (void)
 }
 
 /* Invalidate varobj VAR if it is tied to locals and re-create it if it is
-   defined on globals.  It is a helper for varobj_invalidate.  */
+   defined on globals.  It is a helper for varobj_invalidate.
+
+   This function is called after changing the symbol file, in this case the
+   pointers to "struct type" stored by the varobj are no longer valid.  All
+   varobj must be either re-evaluated, or marked as invalid here.  */
 
 static void
 varobj_invalidate_iter (struct varobj *var, void *unused)
 {
-  /* Floating varobjs are reparsed on each stop, so we don't care if the
-     presently parsed expression refers to something that's gone.  */
-  if (var->root->floating)
-    return;
-
-  /* global var must be re-evaluated.  */     
-  if (var->root->valid_block == NULL)
+  /* global and floating var must be re-evaluated.  */
+  if (var->root->floating || var->root->valid_block == NULL)
     {
       struct varobj *tmp_var;