(Ada) "catch assert" spurious internal error
authorJoel Brobecker <brobecker@adacore.com>
Sat, 8 Sep 2018 21:46:08 +0000 (16:46 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Sat, 8 Sep 2018 21:46:08 +0000 (17:46 -0400)
We noticed while debugging a program compiled without assertions
enabled and using an older compiler that inserting a catchpoint
on failed assertions would cause an internal error:

    (gdb) catch assert
    ../../src/gdb/ada-lang.c:13321: internal-error: ada_exception_sal:
    Assertion`sym != NULL' failed.
    A problem internal to GDB has been detected,

This is due to a combination of factors:

  1. With older versions of the compiler, the function used as a hook
     was provided by a unit that's different from the unit which
     provides the hooks for the other exception catchpoints.

  2. The program either does not use any assertion, or is compiled
     without the assertions enabled.

With newer versions of the compiler, all such functions are provided
by the same unit, so should normally always be available.  However,
there can still be reasons why this is not the case. Consider, for
instance, the case of a runtime compiled with -ffunction-sections,
in which case the hook might be eliminated unless assertions are
used and enabled.

So this patch transforms the internal error into a simple error.

gdb/ChangeLog:

        * ada-lang.c (ada_exception_sal): Replace gdb_assert calls
        by calls to error.

No testcase added, as the existing testcase gdb.ada/catch_ex.exp
should trigger it when using an older version of GNAT as the Ada
compiler.

gdb/ChangeLog
gdb/ada-lang.c

index 41dee6e53adb7060ba6035246d8c7147dc80f8ea..4aeb0ba841f20ad0fc693adce24fa8d33e9a9e25 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-08  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (ada_exception_sal): Replace gdb_assert calls
+       by calls to error.
+
 2018-09-08  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-lang.c (ada_unhandled_exception_name_addr_from_raise):
index 87ae275271df110f8522e76dd82c6618dec41d68..c5cddd044ca2752d0eb95ed8c3c467e1741d123e 100644 (file)
@@ -13215,14 +13215,11 @@ ada_exception_sal (enum ada_exception_catchpoint_kind ex,
   sym_name = ada_exception_sym_name (ex);
   sym = standard_lookup (sym_name, NULL, VAR_DOMAIN);
 
-  /* We can assume that SYM is not NULL at this stage.  If the symbol
-     did not exist, ada_exception_support_info_sniffer would have
-     raised an exception.
-
-     Also, ada_exception_support_info_sniffer should have already
-     verified that SYM is a function symbol.  */
-  gdb_assert (sym != NULL);
-  gdb_assert (SYMBOL_CLASS (sym) == LOC_BLOCK);
+  if (sym == NULL)
+    error (_("Catchpoint symbol not found: %s"), sym_name);
+
+  if (SYMBOL_CLASS (sym) != LOC_BLOCK)
+    error (_("Unable to insert catchpoint. %s is not a function."), sym_name);
 
   /* Set ADDR_STRING.  */
   *addr_string = xstrdup (sym_name);