2011-07-08 15 views
2

我爲python放在一個小調試器,所以我可以基本上附加在程序的中間,並暫停代碼或當某些變量更改或步驟一行等時中斷...基本上pdb但附加(所以更像GDB假設pystack不工作)。從另一個線程啓動後,將systrace處理程序添加到python線程的方式嗎?

對於單線程,對於多線程程序,可以做sys.settrace(),假設沒有線程啓動,可以做threading.settrace(),但問題在於你停止調試整個事情(或者在特定點在一個特定的線程)據我所知。

我想知道是否有一種方法可以在python中爲sys.settrace()這樣的特定不同的線程啓動?

回答

2

好的,這似乎不太可能。

我得到的最接近的是有關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

相關問題