]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45637: Remove broken fallback in gdb helpers to obtain frame variable (GH-29257)
authorPablo Galindo Salgado <Pablogsal@gmail.com>
Tue, 9 Nov 2021 11:19:47 +0000 (11:19 +0000)
committerGitHub <noreply@github.com>
Tue, 9 Nov 2021 11:19:47 +0000 (11:19 +0000)
Lib/test/test_gdb.py
Tools/gdb/libpython.py

index 2805eaf9f95674b1f534818b5b08741c07b22c15..eaeb6fb8ff56876fb7461a8881ac33cc81b07985 100644 (file)
@@ -823,6 +823,8 @@ Traceback \(most recent call first\):
     foo\(1, 2, 3\)
 ''')
 
+    @unittest.skipIf(python_is_optimized(),
+                     "Python was compiled with optimizations")
     def test_threads(self):
         'Verify that "py-bt" indicates threads that are waiting for the GIL'
         cmd = '''
index 54f72320cdd8b387f549b432ca0e557e2dde044b..f4b27f115216b79f5f04f21b5935c7505172e294 100755 (executable)
@@ -1801,17 +1801,13 @@ class Frame(object):
             frame = PyFramePtr(frame)
             if not frame.is_optimized_out():
                 return frame
-            # gdb is unable to get the "frame" argument of PyEval_EvalFrameEx()
-            # because it was "optimized out". Try to get "frame" from the frame
-            # of the caller, _PyEval_Vector().
-            orig_frame = frame
-            caller = self._gdbframe.older()
-            if caller:
-                frame = caller.read_var('frame')
-                frame = PyFramePtr(frame)
-                if not frame.is_optimized_out():
-                    return frame
-            return orig_frame
+            cframe = self._gdbframe.read_var('cframe')
+            if cframe is None:
+                return None
+            frame = PyFramePtr(cframe["current_frame"].dereference())
+            if frame and not frame.is_optimized_out():
+                return frame
+            return None
         except ValueError:
             return None