2009-10-26 9 views
10

Sto usando Eclipse/PyDev cercando di trovare un modo per eseguire il debug di codice che utilizza subprocess.Popen per creare un processo figlio: voglio essere in grado di eseguire il debug del processo figlio che si crea. Il problema è che non riesco a trovare un modo per eseguire il debug sui confini del processo e suppongo che non sia effettivamente possibile. Tuttavia, non si sa mai fino a quando non chiedi, e così che sto facendo!Esiste un modo per eseguire il debug di un sottoprocesso utilizzando pydev?

Un po 'di background: ho un complesso processo di compilazione guidata da Waf che invoca i nostri test di unità chiamando fuori a nose come richiesto: voglio collegare in tali procedure ai fallimenti dei test di unità di debug. So che potrei provare ad eseguire direttamente il naso, ma il problema è che l'ambiente devo configurare per i nostri moduli da caricare in modo corretto è piuttosto complesso e non voglio duplicare il codice per farlo, se posso evitarlo.

Sono a conoscenza della modalità remote debugging ma questo è piuttosto scomodo perché devo richiamare manualmente il debugger nel processo remoto. Se qualcuno conosce un modo per fare ciò che sto cercando di fare, sarebbe molto apprezzato.

+0

Questa domanda e le sue risposte sono abbastanza vecchio, ma mi piacerebbe suggerire che si accetta la risposta da pimlottc invece che la risposta attualmente accettato da Raffaello. La risposta di Raffaello potrebbe essere stata corretta quando è stata data, ma la risposta di pimlottc è assolutamente corretta e molto utile ora. – skrrgwasme

risposta

4

Non mi sembra che PyDev possa farlo (né PyDbg e WinDbg), ma sembra gdb: http://wiki.python.org/moin/DebuggingWithGdb.

+0

Può essa seguire la forchetta nel sottoprocesso o sei solo suggerendo il fissaggio al sottoprocesso manualmente? È interessante sapere che GDB può ispezionare gli stack di Python: non lo sapevo :) – jkp

+0

Sto solo suggerendo di collegarli manualmente al processo. –

+1

La limitazione di dover allegare manualmente, a proposito, è in realtà il risultato di come funzionano i sistemi Unix, e non è specifico per un particolare linguaggio o debugger. –

3

ho trovato qualcosa di una soluzione che potrebbe funzionare per voi.

Come te, ho trovato l'opzione di debug remoto delle chiamate inserendo manualmente per pydevd.settrace() in punti di interruzione desiderati. Ma ho anche notato che i successivi breakpoint PyDev (cioè quelli creati facendo clic sul margine sinistro) sono stati rispettati. Sembra quindi che sia sufficiente la prima chiamata settrace esplicita per stabilire la sessione di debug remoto per il processo e successivamente utilizzare solo i punti di interruzione del debugger normale.

Inoltre, è possibile modificare la chiamata settrace in modo che in realtà non sospende il processo:

import pydevd 
pydevd.settrace(suspend=False) 

Quindi inserire il codice di cui sopra da qualche parte nelle prime fasi del inizializzazione del sottoprocesso e si dovrebbe essere buono. Ancora un po 'un trucco, ma è decisamente migliore del metodo manuale.

+1

C'è anche un flag aggiuntivo per settrace da applicare ai sottotitoli, ma non mi sembra che funzioni in modo affidabile per me: pydevd.settrace (suspend = False, trace_only_current_thread = False) – pimlottc

+0

A partire da PyDev 1.6.4, la tracciatura dei sottotitoli funziona bene per me. La chiamata pydev.settrace (...) viene inserita nella discussione principale. –

Problemi correlati