Catch gdb_exception_error instead of gdb_exception (in many places)
As described in the previous commit for this series, I became concerned that there might be instances in which a QUIT (due to either a SIGINT or SIGTERM) might not cause execution to return to the top level. In some (though very few) instances, it is okay to not propagate the exception for a Ctrl-C / SIGINT, but I don't think that it is ever okay to swallow the exception caused by a SIGTERM. Allowing that to happen would definitely be a deviation from the current behavior in which GDB exits upon receipt of a SIGTERM. I looked at all cases where an exception handler catches a gdb_exception. Handlers which did NOT need modification were those which satisifed one or more of the following conditions: 1) There is no call path to maybe_quit() in the try block. I used a static analysis tool to help make this determination. In instances where the tool didn't provide an answer of "yes, this call path can result in maybe_quit() being called", I reviewed it by hand. 2) The catch block contains a throw for conditions that it doesn't want to handle; these "not handled" conditions must include the quit exception and the new "forced quit" exception. 3) There was (also) a catch for gdb_exception_quit. Any try/catch blocks not meeting the above conditions could potentially swallow a QUIT exception. My first thought was to add catch blocks for gdb_exception_quit and then rethrow the exception. But Pedro pointed out that this can be handled without adding additional code by simply catching gdb_exception_error instead. That's what this patch series does. There are some oddball cases which needed to be handled differently, plus the extension languages, but those are handled in later patches. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=26761 Tested-by: Tom de Vries <tdevries@suse.de> Approved-by: Pedro Alves <pedro@palves.net>
This commit is contained in:
parent
63509715af
commit
b1ffd1124a
@ -12351,7 +12351,7 @@ should_stop_exception (const struct bp_location *bl)
|
||||
scoped_value_mark mark;
|
||||
stop = value_true (evaluate_expression (ada_loc->excep_cond_expr.get ()));
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_fprintf (gdb_stderr, ex,
|
||||
_("Error in testing exception condition:\n"));
|
||||
|
@ -2840,7 +2840,7 @@ insert_bp_location (struct bp_location *bl,
|
||||
if (val)
|
||||
bp_excpt = gdb_exception {RETURN_ERROR, GENERIC_ERROR};
|
||||
}
|
||||
catch (gdb_exception &e)
|
||||
catch (gdb_exception_error &e)
|
||||
{
|
||||
rethrow_on_target_close_error (e);
|
||||
bp_excpt = std::move (e);
|
||||
@ -5302,7 +5302,7 @@ bpstat_check_watchpoint (bpstat *bs)
|
||||
{
|
||||
e = watchpoint_check (bs);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_fprintf (gdb_stderr, ex,
|
||||
"Error evaluating expression "
|
||||
@ -5546,7 +5546,7 @@ bpstat_check_breakpoint_conditions (bpstat *bs, thread_info *thread)
|
||||
{
|
||||
condition_result = breakpoint_cond_eval (cond);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_fprintf (gdb_stderr, ex,
|
||||
"Error in testing breakpoint condition:\n");
|
||||
@ -13518,7 +13518,7 @@ enable_breakpoint_disp (struct breakpoint *bpt, enum bpdisp disposition,
|
||||
bpt->enable_state = bp_enabled;
|
||||
update_watchpoint (w, true /* reparse */);
|
||||
}
|
||||
catch (const gdb_exception &e)
|
||||
catch (const gdb_exception_error &e)
|
||||
{
|
||||
bpt->enable_state = orig_enable_state;
|
||||
exception_fprintf (gdb_stderr, e, _("Cannot enable watchpoint %d: "),
|
||||
|
@ -415,7 +415,7 @@ i386_linux_report_signal_info (struct gdbarch *gdbarch, struct ui_out *uiout,
|
||||
access
|
||||
= parse_and_eval_long ("$_siginfo._sifields._sigfault.si_addr");
|
||||
}
|
||||
catch (const gdb_exception &exception)
|
||||
catch (const gdb_exception_error &exception)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ inferior_event_handler (enum inferior_event_type event_type)
|
||||
{
|
||||
bpstat_do_actions ();
|
||||
}
|
||||
catch (const gdb_exception &e)
|
||||
catch (const gdb_exception_error &e)
|
||||
{
|
||||
/* If the user was running a foreground execution
|
||||
command, then propagate the error so that the prompt
|
||||
|
@ -1585,7 +1585,7 @@ print_return_value (struct ui_out *uiout, struct return_value_info *rv)
|
||||
delete the breakpoint. */
|
||||
print_return_value_1 (uiout, rv);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_print (gdb_stdout, ex);
|
||||
}
|
||||
|
@ -8875,7 +8875,7 @@ normal_stop ()
|
||||
{
|
||||
execute_cmd_pre_hook (stop_command);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_fprintf (gdb_stderr, ex,
|
||||
"Error while running hook_stop:\n");
|
||||
|
@ -716,7 +716,7 @@ jit_reader_try_read_symtab (gdbarch *gdbarch, jit_code_entry *code_entry,
|
||||
code_entry->symfile_size))
|
||||
status = 0;
|
||||
}
|
||||
catch (const gdb_exception &e)
|
||||
catch (const gdb_exception_error &e)
|
||||
{
|
||||
status = 0;
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ breakpoint_notify (struct breakpoint *b)
|
||||
{
|
||||
print_breakpoint (b);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_print (gdb_stderr, ex);
|
||||
}
|
||||
|
@ -841,7 +841,7 @@ mi_print_breakpoint_for_event (struct mi_interp *mi, breakpoint *bp)
|
||||
|
||||
print_breakpoint (bp);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_print (gdb_stderr, ex);
|
||||
}
|
||||
|
@ -1286,7 +1286,7 @@ find_objc_msgcall_submethod (int (*f) (CORE_ADDR, CORE_ADDR *),
|
||||
if (f (pc, new_pc) == 0)
|
||||
return 1;
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_fprintf (gdb_stderr, ex,
|
||||
"Unable to determine target of "
|
||||
|
@ -514,7 +514,7 @@ parse_exp_in_context (const char **stringptr, CORE_ADDR pc,
|
||||
{
|
||||
lang->parser (&ps);
|
||||
}
|
||||
catch (const gdb_exception &except)
|
||||
catch (const gdb_exception_error &except)
|
||||
{
|
||||
/* If parsing for completion, allow this to succeed; but if no
|
||||
expression elements have been written, then there's nothing
|
||||
|
@ -2126,7 +2126,7 @@ do_one_display (struct display *d)
|
||||
d->exp = parse_expression (d->exp_string.c_str (), &tracker);
|
||||
d->block = tracker.block ();
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
/* Can't re-parse the expression. Disable this display item. */
|
||||
d->enabled_p = false;
|
||||
|
@ -2932,7 +2932,7 @@ cmd_record_btrace_start (const char *args, int from_tty)
|
||||
{
|
||||
execute_command ("target record-btrace", from_tty);
|
||||
}
|
||||
catch (const gdb_exception &exception)
|
||||
catch (const gdb_exception_error &exception)
|
||||
{
|
||||
record_btrace_conf.format = BTRACE_FORMAT_BTS;
|
||||
|
||||
|
@ -785,7 +785,7 @@ record_full_message_wrapper_safe (struct regcache *regcache,
|
||||
{
|
||||
record_full_message (regcache, signal);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_print (gdb_stderr, ex);
|
||||
return false;
|
||||
|
@ -785,7 +785,7 @@ update_solib_list (int from_tty)
|
||||
{
|
||||
ops->open_symbol_file_object (from_tty);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_fprintf (gdb_stderr, ex,
|
||||
"Error reading attached "
|
||||
|
@ -139,7 +139,7 @@ sparc64_linux_report_signal_info (struct gdbarch *gdbarch, struct ui_out *uiout,
|
||||
if (si_code >= SEGV_ACCADI && si_code <= SEGV_ADIPERR)
|
||||
addr = parse_and_eval_long ("$_siginfo._sifields._sigfault.si_addr");
|
||||
}
|
||||
catch (const gdb_exception &exception)
|
||||
catch (const gdb_exception_error &exception)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -197,7 +197,7 @@ add_vsyscall_page (inferior *inf)
|
||||
name.c_str (),
|
||||
0 /* from_tty */);
|
||||
}
|
||||
catch (const gdb_exception &ex)
|
||||
catch (const gdb_exception_error &ex)
|
||||
{
|
||||
exception_print (gdb_stderr, ex);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user