python debug查看进程和线程挂死问题和内存泄漏
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 也可以看出进程是否挂死
使用方法 pip install py-spy
py-spy dump -p $pid
py-spy dump -l -p $pid
可以看到当前时刻该进程的各个线程的运行堆栈