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?
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. –
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. –
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. –