Domanda

Sto cercando di eseguire il debug di un deadlock in un'applicazione Python multi-thread dopo che si è bloccato.C'è un modo per collegare un debugger per ispezionare lo stato del processo?

Modificare:Ci sto provando su Linux, ma sarebbe fantastico se ci fosse una soluzione multipiattaforma.Dopotutto è Python :)

È stato utile?

Soluzione

Sì, gdb è utile per il debug di livello inferiore.

Puoi cambiare thread con il file filo comando.

per esempio

(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....

Potresti anche controllare i debugger specifici di Python come Winpdb, O pydb.Entrambi indipendenti dalla piattaforma.

Altri suggerimenti

Utilizzo Winpdb.È un Piattaforma indipendente debugger grafico GPL Python con supporto per il debug remoto su una rete, thread multipli, modifica dello spazio dei nomi, debug integrato, comunicazione crittografata ed è fino a 20 volte più veloce di pdb.

Caratteristiche:

  • Licenza GPL.Winpdb è un software gratuito.
  • Compatibile con CPython da 2.3 a 2.6 e Python 3000
  • Compatibile con wxPython da 2.6 a 2.8
  • Indipendente dalla piattaforma e testato su Ubuntu Gutsy e Windows XP.
  • Interfacce utente:rpdb2 è basato su console, mentre winpdb richiede wxPython 2.6 o successivo.

Screenshot
(fonte: winpdb.org)

Puoi collegare un debugger a un processo Python multi-thread, ma devi farlo a livello C.Per dare un senso a ciò che sta succedendo, è necessario che l'interprete Python sia compilato con simboli.Se non ne hai uno, devi scaricare il codice sorgente da python.org e crearlo tu stesso:

./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy

Assicurati che il tuo carico di lavoro sia in esecuzione su quella versione dell'interprete.Potrai quindi allegarlo con GDB in qualsiasi momento.Quelli di Python hanno incluso un esempio ".gdbinit" nella loro directory Misc, che contiene alcune macro utili.Tuttavia è rotto per il debug multi-thread (!).Devi sostituire righe come questa

while $pc < Py_Main || $pc > Py_GetArgcArgv

con quanto segue:

while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)

Altrimenti comandi like pystack non terminerà su thread diversi dal thread principale.Con queste cose a posto, puoi fare cose come

gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach

e vedere cosa sta succedendo.Tipo.

Puoi analizzare quali sono gli oggetti con la macro "pyo". Chris ha alcuni esempi sul suo blog.

Buona fortuna.

(Un ringraziamento per Il blog di Dan per alcune informazioni chiave per me, in particolare la correzione del threading!)

Se intendi pydb, non c'è modo di farlo.C'è stato qualche sforzo in quella direzione:vedere il commit svn, ma è stato abbandonato.Presumibilmente winpdb lo supporta.

La mia esperienza nel debug di programmi multi-thread in PyDev (Eclipse su Windows XP) è che i thread creati utilizzando thread.start_new_thread non possono essere agganciati, ma il thread creato utilizzando threading.Thread potrebbe essere agganciato.Spero che le informazioni siano utili.

Su quale piattaforma stai tentando di farlo?La maggior parte dei debugger consente di collegarsi a un processo in esecuzione utilizzando l'ID del processo.Puoi generare l'ID del processo tramite la registrazione o utilizzando qualcosa come Task Manager.Una volta ottenuto ciò sarà possibile ispezionare i singoli thread e i relativi stack di chiamate.

MODIFICARE:Non ho alcuna esperienza con GNU Debugger (GDB), che è multipiattaforma, tuttavia ho trovato questo collegamento e potrebbe avviarti sulla strada giusta.Spiega come aggiungere simboli di debug (utili per leggere le tracce dello stack) e come istruire gdb a collegarsi a un processo Python in esecuzione.

pdbinject ti consente di iniettare pdb in un processo Python già in esecuzione.

L'eseguibile pdbinject funziona solo con python2, ma può anche essere inserito correttamente in python3.

IDE PyCharm consente il collegamento a un processo Python in esecuzione dalla versione 4.0.

Qui viene descritto come farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top