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:
parent
a6dc81d2ab
commit
4e969b4f01
@ -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>
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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\"\}\\\]" \
|
||||
|
15
gdb/varobj.c
15
gdb/varobj.c
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user