【问题标题】:python debug tools for multiprocessing [closed]用于多处理的python调试工具[关闭]
【发布时间】:2012-11-23 21:00:49
【问题描述】:

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

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

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

【问题讨论】:

  • 我刚刚开始使用线程,最终我在任何地方都使用了 logging.debug("I made it to function X")。
  • 您在 Windows 上吗?如果是这样,您是否尝试过构建和运行 Python 的调试版本,然后在崩溃时通过将 Visual Studio(崩溃后)和“中断”(使用暂停按钮)附加到崩溃位置来捕获调用堆栈?编辑:需要明确的是,您的脚本有时会导致 Python 本身(而不是您的脚本)崩溃,对吗?
  • 有故障处理模块。 mixing threading and multiprocessing without proper care存在问题

标签: python debugging


【解决方案1】:

我创建了一个模块RemoteException.py,它显示了进程中异常的完整回溯。蟒蛇2。 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

老答案

我也有这个问题。

这就是我所做的...一个 RemoteException 来调试多处理调用

RemoteException.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

【讨论】:

    【解决方案2】:
    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 可用。

    【讨论】:

    • 这是非常有用的提示! pudb.remote.set_trace 会更好,但遗憾的是它不支持 Windows。这就像一个魅力!在 Powershell 上,连接命令是 Telnet 127.0.0.1 6899(使用默认 IP 和端口)。如果没有其他选择,我可能有一天会从 Celery 中将代码作为独立数据包提取到 PyPi。
    • 我注意到使用退格键不起作用(代码看起来不错,但会在调试器中提供SyntaxError)。不知道它是一般的 telnet 连接功能还是只是 Powershell Telnet 的功能。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      它让您可以选择在 fork 中遵循哪个进程。

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

      http://winpdb.org/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-21
        • 2010-10-03
        • 2020-10-28
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 2011-01-21
        • 2012-04-15
        相关资源
        最近更新 更多