From f4c03484da59049eb62a9bf7777b963e2267d187 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Salgado Date: Tue, 9 Nov 2021 11:19:47 +0000 Subject: [PATCH] bpo-45637: Remove broken fallback in gdb helpers to obtain frame variable (GH-29257) --- Lib/test/test_gdb.py | 2 ++ Tools/gdb/libpython.py | 18 +++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 2805eaf9f95..eaeb6fb8ff5 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 54f72320cdd..f4b27f11521 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