Check arguments for all probes before using them
authorAlan Hayward <alan.hayward@arm.com>
Wed, 21 Aug 2019 14:36:37 +0000 (15:36 +0100)
committerAlan Hayward <alan.hayward@arm.com>
Mon, 2 Sep 2019 13:00:42 +0000 (14:00 +0100)
There is a long standing bug in the Arm toolchain where invalid
stap probes get created due to the probes referring to symbols which
have been resolved away.

More details are here:
https://bugzilla.redhat.com/show_bug.cgi?id=1196181

When these invalid probes are present, GDB will create the breakpoints
and then fail to stop. The errors are only spotted the first time
GDB stops, which is too late.

The solution is to ensure the arguments for all the probes are
resolved before using them.

This fixes >100 timeouts when running break-interp.exp when using
bad probes.

gdb/ChangeLog:

* solib-svr4.c (svr4_find_and_create_probe_breakpoints): Check all
probe arguments.

gdb/ChangeLog
gdb/solib-svr4.c

index d0e4258c4f7313068b8167580ae1389a55a9d39d..08615f462e118842df233bf5d415c707c07f1dbe 100644 (file)
@@ -1,3 +1,8 @@
+2019-09-02  Alan Hayward  <alan.hayward@arm.com>
+
+       * solib-svr4.c (svr4_find_and_create_probe_breakpoints): Check all
+       probe arguments.
+
 2019-09-02  Alan Hayward  <alan.hayward@arm.com>
 
        * break-catch-throw.c (fetch_probe_arguments): Use gdbarch.
index 2a44dd69858ae7b0ade6cb07f47f1c1f3ccef3b9..ffae26bfc5f08e503cb33b47d07ee39db56a51fe 100644 (file)
@@ -2071,7 +2071,6 @@ svr4_find_and_create_probe_breakpoints (svr4_info *info,
                                        bool with_prefix)
 {
   std::vector<probe *> probes[NUM_PROBES];
-  bool checked_can_use_probe_arguments = false;
 
   for (int i = 0; i < NUM_PROBES; i++)
     {
@@ -2102,12 +2101,23 @@ svr4_find_and_create_probe_breakpoints (svr4_info *info,
        return false;
 
       /* Ensure probe arguments can be evaluated.  */
-      if (!checked_can_use_probe_arguments)
+      for (probe *p : probes[i])
        {
-         probe *p = probes[i][0];
          if (!p->can_evaluate_arguments ())
            return false;
-         checked_can_use_probe_arguments = true;
+         /* This will fail if the probe is invalid.  This has been seen on Arm
+            due to references to symbols that have been resolved away.  */
+         try
+           {
+             p->get_argument_count (gdbarch);
+           }
+         catch (const gdb_exception_error &ex)
+           {
+             exception_print (gdb_stderr, ex);
+             warning (_("Initializing probes-based dynamic linker interface "
+                        "failed.\nReverting to original interface."));
+             return false;
+           }
        }
     }