diff options
Diffstat (limited to 'gdb/infcall.c')
-rw-r--r-- | gdb/infcall.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/gdb/infcall.c b/gdb/infcall.c index c9d98cf65eb..277399ac941 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -441,6 +441,7 @@ call_function_by_hand (struct value *function, int nargs, struct value **args) struct gdbarch *gdbarch; struct breakpoint *terminate_bp = NULL; struct minimal_symbol *tm; + struct cleanup *terminate_bp_cleanup = NULL; ptid_t call_thread_ptid; struct gdb_exception e; const char *name; @@ -772,7 +773,7 @@ call_function_by_hand (struct value *function, int nargs, struct value **args) /* Register a clean-up for unwind_on_terminating_exception_breakpoint. */ if (terminate_bp) - make_cleanup_delete_breakpoint (terminate_bp); + terminate_bp_cleanup = make_cleanup_delete_breakpoint (terminate_bp); /* - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - If you're looking to implement asynchronous dummy-frames, then @@ -987,6 +988,11 @@ When the function is done executing, GDB will silently stop."), internal_error (__FILE__, __LINE__, _("... should not be here")); } + /* If we get here and the std::terminate() breakpoint has been set, + it has to be cleaned manually. */ + if (terminate_bp) + do_cleanups (terminate_bp_cleanup); + /* If we get here the called FUNCTION ran to completion, and the dummy frame has already been popped. */ |