Catch gdb_exception_error instead of gdb_exception (in many places)
authorKevin Buettner <kevinb@redhat.com>
Mon, 27 Feb 2023 23:11:37 +0000 (16:11 -0700)
committerKevin Buettner <kevinb@redhat.com>
Mon, 27 Feb 2023 23:20:39 +0000 (16:20 -0700)
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>
17 files changed:
gdb/ada-lang.c
gdb/breakpoint.c
gdb/i386-linux-tdep.c
gdb/inf-loop.c
gdb/infcmd.c
gdb/infrun.c
gdb/jit.c
gdb/mi/mi-cmd-break.c
gdb/mi/mi-interp.c
gdb/objc-lang.c
gdb/parse.c
gdb/printcmd.c
gdb/record-btrace.c
gdb/record-full.c
gdb/solib.c
gdb/sparc64-linux-tdep.c
gdb/symfile-mem.c

index 39cca3b9e8027a348c78d92c4042c170724cfd11..7b07c4f947337c0feee50d1775048a51f4a7826d 100644 (file)
@@ -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"));
index 0db3adaf916cc71f65eb4e1ca6862fd641d7ea06..ebf9d8f1349fc2a7608ea836dc39f60be8b8295a 100644 (file)
@@ -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: "),
index ad0377de5a6747227e7c69e141b2f5f835a13189..a6adeca1b97416f7194341151a8ce30723a786a3 100644 (file)
@@ -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;
     }
index f49d1c3c87276558c6b11c229e0ab318fc797caf..b9f25008247c55552c296faf9fbceeacccf6fb10 100644 (file)
@@ -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
index e3436470b7cde57b3fe282d1822411f6592e8a0a..c369b795757411ca554eae9dfe601632fffa878a 100644 (file)
@@ -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);
     }
index 79e1a6abd2aa57232d2193d03a5f587ca9db75b8..ab77300f1ff05f1f3e9864ebd4dd75a7253a0ff2 100644 (file)
@@ -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");
index 0b089bc6a8224e8e5e7f1d5a9ff0ca535c085a2b..7f4b9f0fd370fa9d7da2a204ad5111db0d1611d9 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -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;
     }
index 8b0483803b6b39dedf0c7a314245185a328f5822..75957b75badfbc45f5639cfd9a287873bc891708 100644 (file)
@@ -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);
        }
index 29d1aee82359cf76182d77d5868c5e84811e2200..e1244f3df43871832430c34592c7af4793b3bcaf 100644 (file)
@@ -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);
     }
index f43d158a770de4963c352475033e5abdaac4d121..4a9dee44dd709a04e9e9521206d6bf9d445d9326 100644 (file)
@@ -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 "
index f2917b30740b4de8ee17f4653929a92b047f7f28..b2cc6c59fb53e75e0bf810ec24e13438032a6500 100644 (file)
@@ -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
index 0d3bc292d4ebea9bf74e6aea69432f95e779ea37..341efc779fe5f646f9097451ed3195a75f706ef0 100644 (file)
@@ -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;
index 0daba89381395d7145c3dbd0cda6fe54bb1b590f..61de8491bb9ab7cc29dcbdce2aa89a7ab10b632d 100644 (file)
@@ -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;
 
index e3cfa3f45d599e0a6ad0b380533ecb3b06e43f41..15c5b7d682eded51af6a1ace6692cabb976af397 100644 (file)
@@ -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;
index 60bdf46cb918655abc007c455f4af2d30510a4fc..ec0fcfb5bebc7be274c6c7b93ec90cdb5effc1b9 100644 (file)
@@ -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 "
index beff812eeef0e96fdfa008197ebc0064ed274dd3..685df066f3a77475cc2c69c994590d06eee74aa3 100644 (file)
@@ -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;
     }
index d36b9090e7e2fa4e801a2e1c5e68e980224c2659..7ac3ac709ecb23e190a93f75c1d7c75fdec776ed 100644 (file)
@@ -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);
        }