2013-08-29 Phil Muldoon <pmuldoon@redhat.com>
authorPhil Muldoon <pmuldoon@redhat.com>
Thu, 29 Aug 2013 09:24:33 +0000 (09:24 +0000)
committerPhil Muldoon <pmuldoon@redhat.com>
Thu, 29 Aug 2013 09:24:33 +0000 (09:24 +0000)
PR python/15752

* python/py-framefilter.c (apply_frame_filter): Check
gdb_python_initialized.  Exit if the Python frame-filter code
cannot be initialized.

gdb/ChangeLog
gdb/python/py-framefilter.c

index 411d2b23cefa3177bf36d71bf4a694c300f6af3f..3ce275f93e5fa42eef31c286140ad8f25a136ebd 100644 (file)
@@ -1,3 +1,11 @@
+2013-08-29  Phil Muldoon  <pmuldoon@redhat.com>
+
+       PR python/15752
+
+       * python/py-framefilter.c (apply_frame_filter): Check
+       gdb_python_initialized.  Exit if the Python frame-filter code
+       cannot be initialized.
+
 2013-08-29  Phil Muldoon  <pmuldoon@redhat.com>
 
        PR cli/15842
index d62c5963386c13adf6c77d75f514bb1643b1dcbb..5ac8e477011aa1283d02d37a55094a24921e9a90 100644 (file)
@@ -1468,6 +1468,9 @@ apply_frame_filter (struct frame_info *frame, int flags,
   PyObject *item;
   htab_t levels_printed;
 
+  if (!gdb_python_initialized)
+    return PY_BT_NO_FILTERS;
+
   cleanups = ensure_python_env (gdbarch, current_language);
 
   TRY_CATCH (except, RETURN_MASK_ALL)
@@ -1483,7 +1486,24 @@ apply_frame_filter (struct frame_info *frame, int flags,
   iterable = bootstrap_python_frame_filters (frame, frame_low, frame_high);
 
   if (iterable == NULL)
-    goto error;
+    {
+      /* Normally if there is an error GDB prints the exception,
+        abandons the backtrace and exits.  The user can then call "bt
+        no-filters", and get a default backtrace (it would be
+        confusing to automatically start a standard backtrace halfway
+        through a Python filtered backtrace).  However in the case
+        where GDB cannot initialize the frame filters (most likely
+        due to incorrect auto-load paths), GDB has printed nothing.
+        In this case it is OK to print the default backtrace after
+        printing the error message.  GDB returns PY_BT_NO_FILTERS
+        here to signify there are no filters after printing the
+        initialization error.  This return code will trigger a
+        default backtrace.  */
+
+      gdbpy_print_stack ();
+      do_cleanups (cleanups);
+      return PY_BT_NO_FILTERS;
+    }
 
   /* If iterable is None, then there are no frame filters registered.
      If this is the case, defer to default GDB printing routines in MI
@@ -1521,6 +1541,8 @@ apply_frame_filter (struct frame_info *frame, int flags,
   do_cleanups (cleanups);
   return success;
 
+  /* Exit and abandon backtrace on error, printing the exception that
+     is set.  */
  error:
   gdbpy_print_stack ();
   do_cleanups (cleanups);