Как подключить удаленный отладчик к процессу Python?


Я устал вставлять

import pdb; pdb.set_trace()

строки в мои программы Python и отладка через консоль. Как подключить удаленный отладчик и вставить точки останова из цивилизованного пользовательского интерфейса?

4   51   2009-02-12 23:54:08

4 ответа:

использовать Winpdb. Это независимая платформа графический отладчик GPL Python с поддержкой удаленной отладки по сети, нескольких потоков, модификации пространства имен, встроенной отладки, зашифрованной связи и до 20 раз быстрее, чем pdb.

характеристики:

  • лицензия GPL. Winpdb-это бесплатное программное обеспечение.
  • совместимость с CPython 2.3 через 2.6 и Python 3000
  • совместимость с wxPython 2.6 через 2.8
  • платформа независимая, и протестирована на Ubuntu Gutsy и Windows XP.
  • пользовательские интерфейсы: rpdb2 основан на консоли, в то время как winpdb требует wxPython 2.6 или более поздней версии.

скриншот http://winpdb.org/images/screenshot_winpdb_small.jpg

Ну, вы можете получить что-то очень похожее на это, используя витой люк, который работает так:

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 [email protected] -p 2222
[email protected]'s password: 

используя foobar как пароль.

при входе в систему вы получите обычное приглашение python, где вы можете просто ткнуть в данные. Это не совсем то же самое, что получить обратную связь, отправленную на хост.

теперь это может быть сложно интегрировать в программу GUI, в этом случае вам может потребоваться выбрать другой реактор, например, для программ на основе gtk используется gtk2reactor и т. д.

Если вы хотите, чтобы фактическая обратная связь была отправлена, вам нужно создать канал сокета для stderr, stdin и stdout, который идет по сети вместо печати на локальном хосте. Не должно быть слишком сложно выполнить с помощью twisted.

немного поздно, но вот очень легкое решение для удаленной отладки любезно предоставлено 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()'.

отрегулируйте биты безопасности в соответствии с вашими настройками локальной сети и позицией безопасности, конечно.

два решения из современных IDEs:

  1. кросс-платформенная удаленная отладка PTVS

  2. PyCharm/PyDev удаленная отладка