用于多处理的python调试工具

时间:2012-11-23 21:00:50

标签: python debugging

我有一个python脚本,可以处理线程,进程和数据库连接。 当我运行我的脚本时,python崩溃了。

我无法明确检测出现这种情况的情况。

现在我正在寻找工具来在python崩溃时获取更多信息, 或者查看者查看我创建的所有进程/连接。

4 个答案:

答案 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

RemoteException.py

复制源并删除第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中遵循哪个过程的选项。

它甚至可以捕获最终的异常并允许您查看它的来源。

http://winpdb.org/