我有一个python进程,产生多个后台进程。我目前看到一个/多个后台进程陷入死循环或者他们变得反应迟钝。
我想将调试器附加到后台进程。所以,我可以弄清楚出了什么问题。我已经为我的后台进程(SIGUSR1)注册了一个信号处理程序,我设置了pdb跟踪。
无论何时挂起,我都会将来自其他控制台的信号发送到后台进程。但是,我没有看到任何可以帮助我调试代码的终端。
我做错了吗?或者是否有更好的方法将调试器附加到后台python进程。
我在MAC上运行,所以使用gdb并不是直截了当的。
def installHandlers():
signal.signal(signal.SIGUSR1,debugHandle)
def debugHandle(sig,frame):
global processLog
processLog.info("got the SIGUSR1")
import pdb
pdb.Pdb().set_trace(frame)
-Thanks
答案 0 :(得分:0)
我认为这是因为Python在multiprocessing.Process._bootstrap()中关闭了父进程的stdin。因此,pdb.set_trace()在子进程中不起作用。 它通常会失败并出错。也许你没有看到错误,因为你在某处重定向stdout?
答案 1 :(得分:0)
pdb的克隆,富有想象力地称为pdb-clone,允许debugging of background processes。
您只需将from pdb_clone import pdbhandler; pdbhandler.register()
添加到主进程的代码中,然后就可以使用pdb-attach --kill --pid PID
启动pdb。