(Ada) infinite loop when hitting unhandled exception catchpoint
authorJoel Brobecker <brobecker@adacore.com>
Sat, 8 Sep 2018 21:45:25 +0000 (16:45 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Sat, 8 Sep 2018 21:45:25 +0000 (17:45 -0400)
When debugging a program compiled with an older version of GNAT,
hitting a catchpoint on unhandled exceptions can caused GDB to
got into an infinite loop. This happens while trying to find
the name of the exception that was raised. For that, it searches
for a frame corresponding to a specific function we know gets
called during the exeption handling.

In our particular case, the compiler was too old, and so GDB never
found that frame, and eventually got past the "main" subprogram,
all the way to system frames, where no symbol was available.
As a result, the code addresses could not be resolved into
a function name, leading to the infinite loop because of
a misplaced update of our loop variable "fi":

    while (fi != NULL)
      {
        char *func_name;
        enum language func_lang;

        find_frame_funname (fi, &func_name, &func_lang, NULL);
        if (func_name != NULL)
          {
            make_cleanup (xfree, func_name);

            if (strcmp (func_name,
                        data->exception_info->catch_exception_sym) == 0)
              break; /* We found the frame we were looking for...  */
            fi = get_prev_frame (fi);
          }
      }

If FUNC_NAME is NULL, then FI never gets updated ever after!

gdb/ChangeLog:

        * ada-lang.c (ada_unhandled_exception_name_addr_from_raise):
        Move update of loop variable "fi".

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 0d87f833b294f36333098fba0ae3e253ddb28703..41dee6e53adb7060ba6035246d8c7147dc80f8ea 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-08  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-lang.c (ada_unhandled_exception_name_addr_from_raise):
+       Move update of loop variable "fi".
+
 2018-09-08  Joel Brobecker  <brobecker@adacore.com>
 
        * ada-lang.c (value_assign_to_component): In the case of
index 3618e1d233756b76710a1c6d8ab0dd1070ef0c4f..87ae275271df110f8522e76dd82c6618dec41d68 100644 (file)
@@ -12242,8 +12242,8 @@ ada_unhandled_exception_name_addr_from_raise (void)
           if (strcmp (func_name.get (),
                      data->exception_info->catch_exception_sym) == 0)
            break; /* We found the frame we were looking for...  */
-         fi = get_prev_frame (fi);
        }
+      fi = get_prev_frame (fi);
     }
 
   if (fi == NULL)