我有一个python脚本,可以处理线程,进程和数据库连接。 当我运行我的脚本时,python崩溃了。
我无法明确检测出现这种情况的情况。
现在我正在寻找工具来在python崩溃时获取更多信息, 或者查看者查看我创建的所有进程/连接。
答案 0 :(得分:3)
我创建了一个模块RemoteException.py,它显示了进程中异常的完整回溯。 Python2。 Download it并将其添加到您的代码中:
import RemoteException
@RemoteException.showError
def go():
raise Exception('Error!')
if __name__ == '__main__':
import multiprocessing
p = multiprocessing.Pool(processes = 1)
r = p.apply(go) # full traceback is shown here
OLD ANSWER
我也有问题。
这就是我所做的......用于调试多处理调用的RemoteException
复制源并删除第19行:
file.write('\nin %s ' % (Process.thisProcess,))
和线
import Process
问题是:多处理只传输异常但丢失了回溯。 下面的代码创建一个Exception对象,用于保存回溯。并在调用过程中打印出来。
在您的脚本中,您可以执行以下操作:
import RemoteException
def f():
try:
# here is code that fails but you do know not where
pass
except:
ty, err, tb = RemoteException.exc_info() # like sys.exc_info but with better message
raise ty, err, tb
# here follows your multiprocessing call to f
答案 1 :(得分:1)
我不知道你的情况,但如果你使用线程或多处理,那么你的代码适用于并行处理(通常)。在困难的情况下,我会做所有事情只是调用一个没有池的函数,捕获错误,然后再次进入池。
答案 2 :(得分:1)
pip install celery
然后在你的代码中:
from celery.contrib import rdb; rdb.set_trace()
这就像远程pdb一样,如下所示:
Remote Debugger:6899: Ready to connect: telnet 127.0.0.1 6899
Type `exit` in session to continue.
Remote Debugger:6899: Waiting for client...
从另一个窗口telnet localhost 6899,你有一个完整的功能pdb可用。
答案 3 :(得分:0)
有一个名为WinPDB的图形化调试器,它为您提供了遵循特定Python过程的选项。您可以单步执行并查看调用堆栈中不同位置的所有变量。
它为您提供了在fork中遵循哪个过程的选项。
它甚至可以捕获最终的异常并允许您查看它的来源。