gh-115999: Fix gdb support for libpython.so after thread-local bytecode change (#126440)

Fix the gdb pretty printer in the face of --enable-shared by delaying the attempt to load the _PyInterpreterFrame definition until after .so files are loaded.
This commit is contained in:
T. Wouters 2024-11-05 15:49:27 +01:00 committed by GitHub
parent 75872605aa
commit bbfd9c92fa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 9 additions and 6 deletions

View File

@ -77,10 +77,14 @@ def _managed_dict_offset():
else:
return -3 * _sizeof_void_p()
def _interp_frame_has_tlbc_index():
interp_frame = gdb.lookup_type("_PyInterpreterFrame")
return any(field.name == "tlbc_index" for field in interp_frame.fields())
_INTERP_FRAME_HAS_TLBC_INDEX = None
def interp_frame_has_tlbc_index():
global _INTERP_FRAME_HAS_TLBC_INDEX
if _INTERP_FRAME_HAS_TLBC_INDEX is None:
interp_frame = gdb.lookup_type("_PyInterpreterFrame")
_INTERP_FRAME_HAS_TLBC_INDEX = any(field.name == "tlbc_index"
for field in interp_frame.fields())
return _INTERP_FRAME_HAS_TLBC_INDEX
Py_TPFLAGS_INLINE_VALUES = (1 << 2)
Py_TPFLAGS_MANAGED_DICT = (1 << 4)
@ -109,7 +113,6 @@ FRAME_INFO_OPTIMIZED_OUT = '(frame information optimized out)'
UNABLE_READ_INFO_PYTHON_FRAME = 'Unable to read information on python frame'
EVALFRAME = '_PyEval_EvalFrameDefault'
INTERP_FRAME_HAS_TLBC_INDEX = _interp_frame_has_tlbc_index()
class NullPyObjectPtr(RuntimeError):
pass
@ -1101,7 +1104,7 @@ class PyFramePtr:
def _f_lasti(self):
codeunit_p = gdb.lookup_type("_Py_CODEUNIT").pointer()
instr_ptr = self._gdbval["instr_ptr"]
if INTERP_FRAME_HAS_TLBC_INDEX:
if interp_frame_has_tlbc_index():
tlbc_index = self._gdbval["tlbc_index"]
code_arr = PyCodeArrayPtr(self._f_code().field("co_tlbc"))
first_instr = code_arr.get_entry(tlbc_index).cast(codeunit_p)