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

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

import pdb; pdb.set_trace()

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

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 или новее.


(источник: winpdb.org)

Немного поздно, но вот очень легкое решение для удаленной отладки, предоставленное 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() использует телнет.
  5. Присоединить к программе используя python -c 'import epdb; epdb.connect()',

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

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

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, где вы можете просто ткнуть в данные. Это не совсем то же самое, что отправка трассировки на хост.

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

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

Два решения от современных IDE:

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

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

Я нахожу pudb полезным в экстренных случаях

pip install pudb

Описание проекта https://pypi.org/project/pudb/

Учебник: https://vimeo.com/5255125

Другие вопросы по тегам