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

时间:2009-02-12 20:54:08

标签: python remote-debugging

我已经厌倦了插入

import pdb; pdb.set_trace()

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

5 个答案:

答案 0 :(得分:57)

使用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

答案 1 :(得分:17)

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

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程序可能很棘手,在这种情况下,您可能需要选择另一个反应器,例如使用gtk2reactor等基于gtk的程序。

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

答案 2 :(得分:11)

有点晚了,但这是一个非常轻量级的远程调试解决方案,由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()
  4. ,而不是在程序中使用import epdb; epdb.serve()
  5. 安全登录远程主机,因为epdb.connect()使用telnet。
  6. 使用python -c 'import epdb; epdb.connect()'
  7. 附加到该计划

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

答案 3 :(得分:2)

现代IDE的两个解决方案:

  1. PTVS跨平台远程调试

  2. PyCharm / PyDev远程调试

答案 4 :(得分:0)

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

pip install pudb

项目说明 https://pypi.org/project/pudb/

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