File tree Expand file tree Collapse file tree 1 file changed +23
-7
lines changed
Expand file tree Collapse file tree 1 file changed +23
-7
lines changed Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments