如何将远程调试器连接到Python进程?

56

我厌倦了插入操作

import pdb; pdb.set_trace()

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

5个回答

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

屏幕截图
(来源:winpdb.org)


sudo aptitude安装winpdb - Yauhen Yakimovich
目前,原始的winpdb已经不再维护,网站也已经关闭。然而,它已经被分支:这里 - stevecu

19

有一种非常轻量级的远程调试解决方案,可以安装 http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible 提供的 epdb 进行。

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

当然,根据您的本地网络设置和安全策略进行适当的安全调整。


3
这帮助我调试了一个运行在Docker容器内的Python应用程序。由于使用了Docker Compose和nginx + uwsgi来运行Python应用程序,因此其他解决方案对我都不起作用。但是这个方法有效。 - duality_
这是调试curses应用程序最流畅的方式。干杯! - Qix - MONICA WAS MISTREATED
这还能用吗?我得到了“模块'epdb'没有属性'serve'” - arjabbar
@arjabbar 你有没有使用 https://github.com/native-human/epdb 而不是 https://pypi.org/project/epdb/ 的机会? - adaszko
抱歉回复稍微晚了一点,但这对我现在仍然有效。使用带有pip 19.2.1的python 3.5.2 venv安装pip install epdb可以从https://github.com/sassoftware/epdb获取版本为0.15.1的epdb,并且 epdb.serve()epdb.connect() 方法仍然如上面的答案所示有效。 - CitizenB

18

好的,你可以使用Twisted Manhole获得类似的东西,其工作原理如下:

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,这应该不难完成。


4

现代IDE的两个解决方案:

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

  2. PyCharm / PyDev 远程调试


3
Pycharm要求使用专业版。 - gdbj
1
PTVS似乎有很多问题,特别是与容器相关的问题。而且CPython也不受支持? - lucid_dreamer
1
您也无法使用PyCharm的远程调试器附加到远程进程(请参见:https://youtrack.jetbrains.com/issue/PY-14702)。 - Apteryx

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接