Come faccio a collegare un debugger remoto a un processo di Python?
-
23-08-2019 - |
Domanda
Sono stanco di inserire
import pdb; pdb.set_trace()
linee in miei programmi Python e il debug tramite la console. Come faccio a collegare un debugger remoto e inserisco i punti di interruzione da un'interfaccia utente civilizzato?
Soluzione
Winpdb . Si tratta di un piattaforma indipendente grafica debugger GPL pitone con il supporto per il debug remoto su una rete, più thread, modifica namespace, debug incorporato comunicazione criptata ed è fino a 20 volte più veloce pdb.
Caratteristiche:
- licenza GPL. Winpdb è Software Libero.
- Compatibile con CPython 2.3 a 2.6 e Python 3000
- Compatibile con wxPython 2.6 tramite 2.8
- Indipendente dalla piattaforma, e testato su Ubuntu Gutsy e Windows XP.
- Interfacce utente:. Rpdb2 si basa console, mentre Winpdb richiede wxPython 2.6 o versione successiva
(fonte: winpdb.org )
Altri suggerimenti
Bene, si può ottenere qualcosa di molto simile a quello con un tombino contorto, che funziona in questo modo:
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()
Poi basta il login al programma tramite ssh;
$ ssh admin@localhost -p 2222
admin@localhost's password:
Utilizzando foobar come password.
Quando si accede si otterrà un prompt di pitone normale in cui si può solo colpire i dati. Non è proprio la stessa cosa come ottenere un traceback inviato oltre a un host.
Ora, questo potrebbe essere difficile da integrare a un programma con interfaccia grafica, in questo caso potrebbe essere necessario scegliere un altro reattore, ad esempio per i programmi basati GTK utilizzato il gtk2reactor etc.
Se si desidera che il traceback attuale inviato oltre il necessario per creare un canale di presa sia per stderr, stdin e stdout, che va oltre la rete, invece di stampa al vostro host locale. Non dovrebbe essere troppo difficile da realizzare utilizzando contorto.
Un po 'in ritardo, ma qui è un molto leggero remota soluzione di debug per gentile concessione di http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible :
-
pip install epdb
sulla macchina remota. - Assicurati che la configurazione del firewall non permette connessioni non locali a porta 8080 sulla macchina remota, dal momento che di default
epdb
di ascolto su qualsiasi indirizzo (INADDR_ANY
), non 127.0.0.1. - Invece di usare
import pdb; pdb.set_trace()
nel vostro programma, l'usoimport epdb; epdb.serve()
. - saldamente accedere all'host remoto, dal momento che
epdb.connect()
utilizza telnet. - Fissare al programma tramite
python -c 'import epdb; epdb.connect()'
.
Regolare i bit di sicurezza per soddisfare la vostra configurazione e sicurezza della rete locale di posizione, naturalmente.
Due soluzioni di IDE moderno:
-
PTVS piattaforme debug remoto
-
PyCharm / PyDev debug remoto