[Python-checkins] bpo-45637: Remove broken fallback in gdb helpers to obtain frame variable (GH-29257)

pablogsal webhook-mailer at python.org
Tue Nov 9 06:20:04 EST 2021


https://github.com/python/cpython/commit/f4c03484da59049eb62a9bf7777b963e2267d187
commit: f4c03484da59049eb62a9bf7777b963e2267d187
branch: main
author: Pablo Galindo Salgado <Pablogsal at gmail.com>
committer: pablogsal <Pablogsal at gmail.com>
date: 2021-11-09T11:19:47Z
summary:

bpo-45637: Remove broken fallback in gdb helpers to obtain frame variable (GH-29257)

files:
M Lib/test/test_gdb.py
M Tools/gdb/libpython.py

diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py
index 2805eaf9f9567..eaeb6fb8ff568 100644
--- a/Lib/test/test_gdb.py
+++ b/Lib/test/test_gdb.py
@@ -823,6 +823,8 @@ def test_bt_full(self):
     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 = '''
diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py
index 54f72320cdd8b..f4b27f115216b 100755
--- a/Tools/gdb/libpython.py
+++ b/Tools/gdb/libpython.py
@@ -1801,17 +1801,13 @@ def get_pyop(self):
             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
 



More information about the Python-checkins mailing list