8

我有一个 python 脚本,它与线程、进程和与数据库的连接一起工作。当我运行我的脚本时,python 崩溃了。

我无法明确检测到发生这种情况的情况。

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

4

4 回答 4

4

我创建了一个模块RemoteException.py,它显示了进程中异常的完整回溯。蟒蛇2。下载它并将其添加到您的代码中:

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

旧答案

我也有这个问题。

这就是我所做的......一个远程异常来调试多处理调用

远程异常.py

复制源代码并删除第 19 行: file.write('\nin %s ' % (Process.thisProcess,)) 和行 import Process

问题是:多处理只传输异常但丢失了回溯。下面的代码创建一个保存回溯的异常对象。并在调用过程中打印出来。

在您的脚本中,您可以执行以下操作:

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
于 2013-01-14T21:31:09.280 回答
4
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 可用。

于 2018-01-20T05:03:22.747 回答
1

我不知道您的情况,但是如果您使用线程或多处理,那么您的代码(通常)适用于并行处理。在困难的情况下,我所做的一切只是调用没有池的函数,捕获错误,然后再次进入池。

于 2012-11-25T19:58:59.753 回答
0

有一个名为 WinPDB 的图形调试器,它使您可以选择遵循特定的 Python 进程。您可以单步执行并查看调用堆栈中不同位置的所有变量。

它为您提供了在 fork 中遵循哪个进程的选项。

它甚至会捕获最终异常并让您查看它的来源。

http://winpdb.org/

于 2012-11-25T20:06:00.677 回答