2013-09-23 14 views
5

Ho un'applicazione Python multithread in esecuzione su un server Linux. Posso usare il Debug Server di PyDev per eseguire il debug in remoto, che sembra una risorsa di debug molto preziosa. Tuttavia, sto vedendo un problema che impedisce di essere tanto utile quanto vorrei.Ottenere PyDev sospendere il funzionamento su thread diversi da MainThread

Mentre la mia applicazione è in esecuzione sul server, posso entrare in Eclipse nell'altra casella, sospendere MainThread, ottenere una bella traccia di stack di ciò che stava facendo in quel momento, quindi riprendere l'esecuzione. È ottimo. Tuttavia, quando provo su uno dei thread figli, il pulsante di sospensione si affievolisce ma non c'è traccia dello stack e tutto continua a funzionare normalmente. Posso vedere nella finestra Debug che c'è un thread figlio ed è PID, ma in realtà non può controllarlo o vedere a cosa serve. Facendo clic con il tasto destro del mouse e provando lo "stack di copia" che mi sembra utile, mi viene fornito solo "Thread-4 - pid29848_seq5".

I punti di interruzione sembrano funzionare correttamente. Se un thread secondario colpisce uno di questi, posso scorrere e guardare le variabili e così via. Tuttavia, l'utilizzo di questo mi impone di avere già un punto di interesse specifico nel codice. Sto davvero cercando la mia applicazione e, quando entra in uno stato insolito, uso PyDev per vedere cosa succede.

Ho qualcosa che non va con il mio setup? È solo una limitazione di PyDev contro cui mi trovo? Come posso vedere cosa sta succedendo con i thread figli?

+0

Ho lo stesso problema. Eclipse, PyDev, Django, server remoto che utilizza il comando manage.py runserver --noautoreload. Non ho fortuna, non posso impostare un punto di interruzione in nessuna delle viste. –

+0

Così ho aggiunto time.sleep (10000) in uno dei metodi get view del mio codice python, e PyDev non ha stack visibili, posso vedere il thread ma non c'è stack. –

+0

Quindi sono arrivato al punto in cui sono stato in grado di vedere lo stack all'interno dei thread aggiungendo: pydevd.settrace (suspend = False) appena prima del punto di interruzione, ovunque nel thread prima che il codice con un punto di interruzione faccia , ma non sono sicuro del motivo per cui questo è necessario perché secondo i documenti di Python per settrace() "Imposta una funzione di traccia per tutti i thread avviati dal modulo di threading.". Lo esamineremo ulteriormente. –

risposta

-2

Dato che Python in realtà non esegue correttamente i thread (il GIL è destinato a gettare le cose in un modo o nell'altro) non sarei sorpreso se il debugging fosse un'esperienza meno che elettrizzante. In questo caso non è una buona esperienza eseguire il debug di thread C/C++, anche con le ultime versioni di GDB e CDT.

In realtà non ne sono sicuro, ma ho la sensazione che l'adozione di più processi in Python anziché di più thread possa migliorare la tua esperienza. Se organizzi le cose in modo che una singola istanza di Eclipse/PyDev eseguisse il debug di un singolo processo Python potresti finire con un sacco di finestre sullo schermo, ma sarà un'esperienza di debug molto più flessibile.

Questo è quello che facevo in VxWorks in C, dove non c'erano thread o processi solo attività. Una conseguenza era che si poteva eseguire un debugger per ogni attività ed era meraviglioso.

0

sono riuscito a capirlo dopo aver guardato uno dei post di Fabio:

threading.settrace(pydevd.GetGlobalDebugger().trace_dispatch) 

dovrebbe essere aggiunto dopo aver chiamato pydev.settrace()

Problemi correlati