Destroy allocated values when exiting GDB

When the user exits GDB, we might still have some allocated values in
the chain, which, in specific scenarios, can cause problems when GDB
attempts to destroy them in "quit_force".  For example, see the bug
reported at:

  https://bugzilla.redhat.com/show_bug.cgi?id=1690120

And the thread starting at:

  https://sourceware.org/ml/gdb-patches/2019-03/msg00475.html
  Message-ID: <87r2azkhmq.fsf@redhat.com>

In order to avoid that, and to be more aware of our allocated
resources, this commit implements a new function "finalize_values" and
calls it from inside "quit_force".

Tested by the BuildBot.

2019-04-01  Sergio Durigan Junior  <sergiodj@redhat.com>
	    Pedro Alves  <palves@redhat.com>

	* top.c (quit_force): Call 'finalize_values'.
	* value.c (finalize_values): New function.
	* value.h (finalize_values): Declare.
This commit is contained in:
Sergio Durigan Junior 2019-03-29 17:34:54 -04:00
parent 34ef62f465
commit 9d1447e09d
4 changed files with 25 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2019-04-01 Sergio Durigan Junior <sergiodj@redhat.com>
Pedro Alves <palves@redhat.com>
* top.c (quit_force): Call 'finalize_values'.
* value.c (finalize_values): New function.
* value.h (finalize_values): Declare.
2019-03-30 Eli Zaretskii <eliz@gnu.org>
* NEWS: Announce $_gdb_major and $_gdb_minor.

View File

@ -1673,6 +1673,12 @@ quit_force (int *exit_arg, int from_tty)
}
END_CATCH
/* Destroy any values currently allocated now instead of leaving it
to global destructors, because that may be too late. For
example, the destructors of xmethod values call into the Python
runtime, which is finalized via a final cleanup. */
finalize_values ();
/* Do any final cleanups before exiting. */
TRY
{

View File

@ -4132,3 +4132,11 @@ prevents future values, larger than this size, from being allocated."),
selftests::test_insert_into_bit_range_vector);
#endif
}
/* See value.h. */
void
finalize_values ()
{
all_values.clear ();
}

View File

@ -1189,4 +1189,8 @@ extern struct value *call_xmethod (struct value *method,
extern int value_union_variant (struct type *union_type,
const gdb_byte *contents);
/* Destroy the values currently allocated. This is called when GDB is
exiting (e.g., on quit_force). */
extern void finalize_values ();
#endif /* !defined (VALUE_H) */