From: Sergio Durigan Junior Date: Fri, 29 Mar 2019 21:34:54 +0000 (-0400) Subject: Destroy allocated values when exiting GDB X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9d1447e09d4aa673826039321163b5a684e8e043;p=binutils-gdb.git 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 Pedro Alves * top.c (quit_force): Call 'finalize_values'. * value.c (finalize_values): New function. * value.h (finalize_values): Declare. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a3dfd316987..3de5992d87b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2019-04-01 Sergio Durigan Junior + Pedro Alves + + * top.c (quit_force): Call 'finalize_values'. + * value.c (finalize_values): New function. + * value.h (finalize_values): Declare. + 2019-03-30 Eli Zaretskii * NEWS: Announce $_gdb_major and $_gdb_minor. diff --git a/gdb/top.c b/gdb/top.c index afb77c0ec95..1fc259fe0f4 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -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 { diff --git a/gdb/value.c b/gdb/value.c index dc297dfe0f9..bcfc084e090 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -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 (); +} diff --git a/gdb/value.h b/gdb/value.h index d3905cc354a..0756d13b6d7 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -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) */