2017-02-10 254 views
4

我有一個多線程應用程序在生產環境中運行,掛起在隨機時間FUTEX_WAIT_PRIVATE狀態的所有線程和gdb顯示所有線程都試圖鎖定調用PyThread_acquire_lock。這是真正的海量應用程序,數以萬計的代碼行,我無法猜測這個錯誤發生在哪一行。 我可以以某種方式調試此問題嗎?我可以修補threading.Lock調用和日誌文件所有鎖都獲得/釋放在應用程序中,然後讀取此文件的情況下再次發生錯誤,但我認爲還有其他的Python函數調用PyThread_acquire_lock。那麼我該如何調試這個問題呢?也許有可能在Python的這個C函數調用中「訂閱」並記錄所有這些調用?調試PyThread_acquire_lock死鎖

回答

4

您只需一步就可以找到答案:附加gdb以解鎖死進程,並使用Python gdb擴展來檢查處於死鎖狀態的行。

對於gdb --version> = 7:

sudo apt install python2.7-dbg python3-dbg 
sudo gdb /usr/bin/python[3] <pid_of_deadlocked_process> 
(gdb) thread apply all py-list 
(gdb) thread 2 
(gdb) py-up 
(gdb) py-print <lock_object> 

參考文獻:https://docs.python.org/devguide/gdb.htmlhttps://wiki.python.org/moin/DebuggingWithGdb

+0

謝謝這聽起來不錯,我會再次趕上這個錯誤時,試試這個! – skavans