1、python 調試工具 pyrasite 可以附加到python進程中,在這個進程中打開一個python 命令行。然后再這個里面執行代碼。
(對於這種掛死問題通常是由於多進程和多線程混用導致的,多線程中如果有鎖,在使用fork創建多進程的過程中fork出來的進程是單線程執行的,只會復制內存中的對象當前的信息,如果有一把鎖被別的線程獲取到,我們當前fork出的進程中的這個線程中,這把鎖的狀態只會是鎖定狀態,會導致子進程中再使用這個鎖的時候會導致死鎖。)
2、對於python進程中的掛死問題,我們需要對於進程中所有的線程查看它們卡死在了哪一個位置。
當我們進入這個進程中后,我們可以執行下面的代碼查看進程的幀棧。
import sys for threadid,stack in sys._current_frame().items(): print(threadid,stack)
3、對於內存泄漏問題,我們可以使用objgraph來查看內存泄漏,對於python 代碼造成的內存泄漏,我們可以很容易得看出來泄漏對象的引用關系。
但是對於C代碼造成的泄漏,我們通常只能看出對象類型來,並不能看出泄漏對象的引用關系。所以還要一步一步排除。
4 py-spy 也可以看出進程是否掛死