Skip to content

Commit a44b2a7

Browse files
committed
Support older versions of Python
1 parent 9d0e6ba commit a44b2a7

File tree

1 file changed

+23
-7
lines changed

1 file changed

+23
-7
lines changed

Tools/gdb/libpython.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,16 +1055,32 @@ def __init__(self, gdbval):
10551055
pnames = self.co.field('co_localsplusnames')
10561056
self.co_localsplusnames = PyTupleObjectPtr.from_pyobject_ptr(pnames)
10571057

1058+
@staticmethod
1059+
def get_thread_state():
1060+
exprs = [
1061+
'_Py_tss_gilstate', # 3.15+
1062+
'_Py_tss_tstate', # 3.12+ (and not when GIL is released)
1063+
'pthread_getspecific(_PyRuntime.autoTSSkey._key)', # only live programs
1064+
'((struct pthread*)$fs_base)->specific_1stblock[_PyRuntime.autoTSSkey._key].data' # x86-64
1065+
]
1066+
for expr in exprs:
1067+
try:
1068+
val = gdb.parse_and_eval(f'(PyThreadState*)({expr})')
1069+
except gdb.error:
1070+
continue
1071+
if int(val) != 0:
1072+
return val
1073+
return None
1074+
10581075
@staticmethod
10591076
def get_thread_local_frame():
1060-
try:
1061-
return PyFramePtr(gdb.parse_and_eval('_Py_tss_gilstate->current_frame'))
1062-
except gdb.error:
1063-
pass
1064-
try:
1065-
return PyFramePtr(gdb.parse_and_eval('_Py_tss_tstate->current_frame'))
1066-
except gdb.error:
1077+
thread_state = PyFramePtr.get_thread_state()
1078+
if thread_state is None:
1079+
return None
1080+
current_frame = thread_state['current_frame']
1081+
if int(current_frame) == 0:
10671082
return None
1083+
return PyFramePtr(current_frame)
10681084

10691085
def is_optimized_out(self):
10701086
return self._gdbval.is_optimized_out

0 commit comments

Comments
 (0)