2009-10-26 14 views
10

Używam Eclipse/PyDev próbuje znaleźć drogę do debugowania kodu, który używa subprocess.Popen aby utworzyć procesu potomnego: Chcę, aby móc debugować proces podrzędny, który jest tworzony. Problem polega na tym, że nie mogę znaleźć sposobu na debugowanie granic procesów i domyślam się, że tak naprawdę nie jest to możliwe. Mimo to nigdy nie wiesz, dopóki nie zapytasz, a ja tak robię!Czy istnieje sposób debugowania podprocesu przy użyciu pydev?

Trochę tła: Mam złożony proces kompilacji oparty na Waf, który wywołuje nasze testy jednostkowe, wywołując odpowiednio nose: Chcę podłączyć się do tych procesów, aby zdebugować niepowodzenia testów jednostkowych. Wiem, że mógłbym spróbować uruchomić nos bezpośrednio, ale problem polega na tym, że środowisko, które muszę skonfigurować, aby nasze moduły ładowały się poprawnie, jest dość złożone i nie chcę duplikować kodu, aby to zrobić, jeśli mogę tego uniknąć.

Jestem świadomy trybu remote debugging, ale to bardzo niewygodne, ponieważ muszę ręcznie wywołać debugger w procesie zdalnym. Jeśli ktoś wie, jak zrobić to, co próbuję zrobić, byłby mile widziany.

+0

To pytanie i jego odpowiedzi są dość stare, ale chciałbym zasugerować, abyś zaakceptował odpowiedź od pimlottc zamiast obecnie akceptowanej odpowiedzi Rafaela. Odpowiedź Raphaela mogła być poprawna, gdy została podana, ale odpowiedź Pimlottca jest absolutnie poprawna i bardzo przydatna teraz. – skrrgwasme

Odpowiedz

4

Nie wydaje mi się, że PyDev może to zrobić (ani PyDbg, ani WinDbg), ale wygląda na to, że gdb może: http://wiki.python.org/moin/DebuggingWithGdb.

+0

Czy może podążać za widelcem do podprocesu, czy sugerujesz ręczne dołączanie do podprocesu? Ciekawe, że GDB może sprawdzać stosy Pythona: Nie wiedziałem tego :) – jkp

+0

Po prostu sugeruję dołączenie do procesu ręcznie. –

+1

Ograniczenie konieczności dołączyć ręcznie, nawiasem mówiąc, jest w rzeczywistości rezultatem, jak działają systemy Unix, a nie jest specyficzny dla konkretnego języka lub debugger. –

3

Znalazłem coś obejście, które mogą pracować dla Ciebie.

Tak jak ty, ja pierwszy znalazłem opcję zdalnego debugowania połączeń ręcznego wstawiania do pydevd.settrace() w pożądanych pułapki. Zauważyłem jednak, że kolejne punkty przerwania PyDev (tj. Te tworzone przez kliknięcie na lewym marginesie) były przestrzegane. Wydaje się więc, że potrzebujesz tylko pierwszego jawnego wywołania settrace, aby ustanowić sesję zdalnego debugowania dla procesu, a następnie po prostu użyj normalnych punktów przerwania debuggera.

Ponadto można zmodyfikować połączenia settrace więc faktycznie nie zawiesić proces:

import pydevd 
pydevd.settrace(suspend=False) 

więc wstawić powyższy kod gdzieś na początku inicjalizacji podproces i powinno być dobrze. Wciąż trochę hackowania, ale zdecydowanie lepsze niż metoda ręczna.

+1

Istnieje również dodatkowa flaga dla settrace zastosowanie do subthreads, ale nie wydają się działać niezawodnie, że dla mnie: pydevd.settrace (zawiesić = False, trace_only_current_thread = false) – pimlottc

+0

As z PyDev 1.6.4, kalka subthreads prace Mi pasuje. Wywołanie pydev.settrace (...) znajduje się w głównym wątku. –

Powiązane problemy