代码之家  ›  专栏  ›  技术社区  ›  joeforker

如何将远程调试器附加到Python进程?

  •  57
  • joeforker  · 技术社区  · 16 年前

    我厌倦了插入

    import pdb; pdb.set_trace()
    

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

    5 回复  |  直到 16 年前
        1
  •  57
  •   Glorfindel Doug L.    6 年前

    使用 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或更高版本。

    Screenshot
    (来源: winpdb.org )

        2
  •  17
  •   Johan Dahlin Idelic    16 年前

    嗯,你可以用一个扭曲的检修孔得到类似的东西 工作原理如下:

    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: 
    

    使用 富巴 作为密码。

    当你登录时,你会得到一个正常的python提示符,你可以在那里戳数据。 这与将回溯发送给主机并不完全相同。

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

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

        3
  •  16
  •   CitizenB    7 年前

    有点晚了,但这是一个非常轻量级的远程调试解决方案,由 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()' .

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

        4
  •  3
  •   den.run.ai    10 年前

    现代IDE的两种解决方案:

    1. PTVS (Visual Studio的Python工具)跨平台远程调试

    2. PyCharm / PyDev 远程调试

        5
  •  0
  •   Vinoj John Hosan    5 年前

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

    pip install pudb
    

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

    https://vimeo.com/5255125