Memory leak reading frame register during inferior event handling

When using a conditional breakpoint where the condition evaluated
to false a large number of times before the program stopped,
a user reported that GDB's memory consumption was growing very
quickly until it ran out of memory.

The problem was tracked down to temporary struct values being created
each time the program stops and handles an inferior event.  Because
the breakpoint condition usually evaluates to false, there can be
a fairly large number of such events to be handled before we eventually
return the prompt to the user (which is when we would normally purge
such values).

This patch fixes the issue by making sure that handle_inferior_event
releases all new values created during its execution.

gdb/ChangeLog:

        * infrun.c (handle_inferior_event_1): Renames handle_inferior_event.
        (handle_inferior_event): New function.
This commit is contained in:
Joel Brobecker 2015-02-13 11:57:29 +01:00
parent 1da0522ea7
commit 0b6e5e1085
2 changed files with 22 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2015-05-20 Joel Brobecker <brobecker@adacore.com>
* infrun.c (handle_inferior_event_1): Renames handle_inferior_event.
(handle_inferior_event): New function.
2015-05-20 Joel Brobecker <brobecker@adacore.com> 2015-05-20 Joel Brobecker <brobecker@adacore.com>
* ada-lang.c (to_fixed_array_type): Rename local variable * ada-lang.c (to_fixed_array_type): Rename local variable

View File

@ -3680,7 +3680,7 @@ get_inferior_stop_soon (ptid_t ptid)
once). */ once). */
static void static void
handle_inferior_event (struct execution_control_state *ecs) handle_inferior_event_1 (struct execution_control_state *ecs)
{ {
enum stop_kind stop_soon; enum stop_kind stop_soon;
@ -4202,6 +4202,22 @@ Cannot fill $_exitsignal with the correct signal number.\n"));
} }
} }
/* A wrapper around handle_inferior_event_1, which also makes sure
that all temporary struct value objects that were created during
the handling of the event get deleted at the end. */
static void
handle_inferior_event (struct execution_control_state *ecs)
{
struct value *mark = value_mark ();
handle_inferior_event_1 (ecs);
/* Purge all temporary values created during the event handling,
as it could be a long time before we return to the command level
where such values would otherwise be purged. */
value_free_to_mark (mark);
}
/* Come here when the program has stopped with a signal. */ /* Come here when the program has stopped with a signal. */
static void static void