¿Cómo adjunto un depurador remoto a un proceso Python?


Estoy cansado de insertar

import pdb; pdb.set_trace()

Líneas en mis programas Python y depuración a través de la consola. ¿Cómo puedo conectar un depurador remoto e insertar puntos de interrupción desde una interfaz de usuario civilizada?

Author: joeforker, 2009-02-12

4 answers

Use Winpdb. Es un depurador python GPL gráfico independiente de la plataforma con soporte para depuración remota a través de una red, subprocesos múltiples, modificación de espacios de nombres, depuración incrustada, comunicación cifrada y es hasta 20 veces más rápido que pdb.

Características:

  • Licencia GPL. Winpdb es Software Libre.
  • Compatible con CPython 2.3 a 2.6 y Python 3000
  • Compatible con wxPython 2.6 a 2.8
  • Plataforma independiente, y probado en Ubuntu Gutsy y Windows XP.
  • Interfaces de usuario: rpdb2 está basado en consola, mientras que winpdb requiere wxPython 2.6 o posterior.

Captura de pantalla http://winpdb.org/images/screenshot_winpdb_small.jpg

 57
Author: nosklo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-13 05:32:18

Bueno, puedes obtener algo bastante similar a eso usando una alcantarilla retorcida, que funciona así:

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() 

Luego simplemente inicia sesión en el programa a través de ssh;

$ ssh admin@localhost -p 2222
admin@localhost's password: 

Usando foobar como contraseña.

Cuando inicies sesión, obtendrás un mensaje de Python normal donde solo puedes hurgar en los datos. No es lo mismo que conseguir un rastreo enviado a un anfitrión.

Ahora, esto podría ser difícil de integrar a un programa GUI, en ese caso es posible que deba elegir otro reactor, por ejemplo para programas basados en gtk, usaba el gtk2reactor, etc.

Si desea que se envíe el seguimiento real, debe crear un canal de socket para stderr, stdin y stdout que pase por la red en lugar de imprimir en su host local. No debería ser demasiado difícil de lograr usando twisted.

 17
Author: Johan Dahlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-12 21:07:19

Un poco tarde, pero aquí hay una solución de depuración remota muy ligera cortesía de http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible :

  1. pip install epdb en el host remoto.
  2. Asegúrese de que su configuración de cortafuegos no permita conexiones no locales al puerto 8080 en el host remoto, ya que epdb por defecto escucha en cualquier dirección (INADDR_ANY), no 127.0.0.1.
  3. En lugar de usar import pdb; pdb.set_trace() en su programa, use import epdb; epdb.serve().
  4. Inicie sesión de forma segura en el host remoto, ya que epdb.connect() utiliza telnet.
  5. Adjuntar al programa usando python -c 'import epdb; epdb.connect()'.

Ajuste los bits de seguridad para adaptarse a su configuración de red local y postura de seguridad, por supuesto.

 10
Author: CitizenB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 21:09:43

Dos soluciones de los IDE modernos:

  1. Depuración remota multiplataforma de PTV

  2. Depuración remota PyCharm / PyDev

 2
Author: denfromufa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-02 15:37:29