Re-evaluate floating variables as part of variable invalidate to remove
references to type structures that might have been freed.
This commit is contained in:
Andrew Burgess 2012-07-30 12:10:23 +00:00
parent a6dc81d2ab
commit 4e969b4f01
4 changed files with 27 additions and 8 deletions

View 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>

View 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.

View 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\"\}\\\]" \

View 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;