好的,這似乎不太可能。
我得到的最接近的是有關thread2(killable threads)的消息,它調用PyThreadState_SetAsyncExc
,這引發了一個異常,並且在另一個線程中調用構造函數,而這是無用的。
我的解決辦法是要不要使用sys.settrace可言,而只是用sys.setcheckinterval
將其設置爲1
,當我離開我的調試線,再換一些數量巨大(sys.maxint
也許)當我進入調試線程(同時抓取GIL)。隨着看着sys._current_frames()
。
這幾乎和sys.settrace一樣好,可能比較慢,但可以隨時對任何線程運行。
編輯:
首先 - 我發現,這樣做setcheckinterval不足以阻止其他線程,但它可以爲特定的Python版本通過設置全局_Py_Ticker(在ceval進行到一定程度。 c而不是一個靜態的全局,所以你可以使用ctypes),並確保你不會在你的代碼中釋放GIL。
w.r.t.原始問題,我查看了CPython中的c代碼,並找到了遍歷線程狀態對象並調整它們以包含tracefunc和traceobj的方法;你可以在我的調試器中看到我怎麼做 - https://github.com/bobfrank/pydebug/blob/master/debug.py#L291