【问题标题】:How do I attach a remote debugger to a Python process?如何将远程调试器附加到 Python 进程?
【发布时间】:2010-10-07 06:58:27
【问题描述】:

我已经厌倦了插入

import pdb; pdb.set_trace()

进入我的 Python 程序并通过控制台进行调试。如何连接远程调试器并从文明的用户界面插入断点?

【问题讨论】:

    标签: python remote-debugging


    【解决方案1】:

    我发现 pudb 在紧急情况下很有用

    pip install pudb
    

    项目描述 https://pypi.org/project/pudb/

    教程: https://vimeo.com/5255125

    【讨论】:

      【解决方案2】:

      使用Winpdb。它是一个平台无关图形化 GPL Python 调试器,支持通过网络进行远程调试、多线程、命名空间修改、嵌入式调试、加密通信,并且比 pdb 快 20 倍。

      特点:

      • GPL 许可证。 Winpdb 是免费软件。
      • 与 CPython 2.3 到 2.6 和 Python 3000 兼容
      • 与 wxPython 2.6 到 2.8 兼容
      • 独立于平台,并在 Ubuntu Gutsy 和 Windows XP 上进行了测试。
      • 用户界面:rpdb2 基于控制台,而 winpdb 需要 wxPython 2.6 或更高版本。


      (来源:winpdb.org

      【讨论】:

      • sudo aptitude install winpdb
      【解决方案3】:

      有点晚了,但这里是http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible 提供的一个非常轻量级的远程调试解决方案:

      1. pip install epdb 在远程主机上。
      2. 确保您的防火墙设置不允许非本地连接到远程主机上的端口 8080,因为epdb 默认侦听任何地址 (INADDR_ANY),而不是 127.0.0.1。
      3. 不要在程序中使用import pdb; pdb.set_trace(),而是使用import epdb; epdb.serve()
      4. 安全登录到远程主机,因为epdb.connect() 使用telnet。
      5. 使用python -c 'import epdb; epdb.connect()'附加到程序。

      当然,请调整安全位以适应您的本地网络设置和安全状况。

      【讨论】:

      • 这帮助我调试了一个在 Docker 容器中运行的 python 应用程序。使用 Docker Compose 和 nginx + uwsgi 运行 python 应用程序使设置更加复杂,因此其他解决方案都不适合我。这个做到了。
      • 这是调试 curses 应用程序的最巧妙方法。干杯!
      • 这还能用吗?我得到module 'epdb' has no attribute 'serve'
      • @arjabbar 您是否有机会使用github.com/native-human/epdb 而不是pypi.org/project/epdb
      • 为唯一非常迟到的回复道歉,这对我现在仍然有效。来自带有 pip 19.2.1 的 python 3.5.2 venv 的 pip install epdb 让我从 github.com/sassoftware/epdb 获取 epdb 0.15.1,epdb.serve()epdb.connect() 方法仍然有效,如上面的答案所示。
      【解决方案4】:

      现代 IDE 的两种解决方案:

      1. PTVS 跨平台远程调试

      2. PyCharm/PyDev 远程调试

      【讨论】:

      • Pycharm 要求是专业版
      • PTVS 似乎有很多问题,尤其是容器问题。而且不支持CPython?
      • 您也不能使用 PyCharm 的远程调试器附加到远程进程(请参阅:youtrack.jetbrains.com/issue/PY-14702
      【解决方案5】:

      嗯,你可以得到与使用扭曲沙井非常相似的东西, 像这样工作:

      from twisted.internet import reactor
      from twisted.cred import portal, checkers 
      from twisted.conch import manhole, manhole_ssh 
      
      def getManholeFactory(namespace):
          realm = manhole_ssh.TerminalRealm()
          def getManhole(_): 
              return manhole.Manhole(namespace) 
          realm.chainedProtocolFactory.protocolFactory = getManhole
          p = portal.Portal(realm)
          p.registerChecker(
              checkers.InMemoryUsernamePassword DatabaseDontUse(admin='foobar'))
          f = manhole_ssh.ConchFactory(p)
          return f
      
      reactor.listenTCP(2222, getManholeFactory(globals()))
      reactor.run() 
      

      然后你只需通过 ssh 登录程序;

      $ ssh admin@localhost -p 2222
      admin@localhost's password: 
      

      使用 foobar 作为密码。

      当您登录时,您会看到一个正常的 python 提示,您可以在其中查看数据。 这与将回溯发送到主机并不完全相同。

      现在,这可能很难集成到 GUI 程序中,在这种情况下,您可能需要选择另一个反应器,例如基于 gtk 的程序使用 gtk2reactor 等。

      如果您希望发送实际的回溯,您需要为 stderr、stdin 和 stdout 创建一个套接字通道,该通道通过网络而不是打印到您的本地主机。使用twisted应该不会太难完成。

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 1970-01-01
        • 2010-09-26
        • 2018-08-04
        • 2017-12-30
        • 2020-08-25
        • 2019-08-12
        • 2012-02-11
        相关资源
        最近更新 更多