2013-09-30 34 views
19

Użyłem ipdb.set_trace() gdzieś w moim kodzie Pythona. Czy można zignorować ten punkt przerwania za pomocą polecenia IPDB?Czy można usunąć zestaw punktów przerwań za pomocą ipdb.set_trace()?

mówi, że wyczyścił wszystkie punkty przerwania, ale IPDB zatrzymuje się ponownie, gdy natknie się na linię z ipdb.set_trace().

disable 1 mówi mi: No breakpoint numbered 1 ignore 1 mówi: Breakpoint index '1' is not valid

Aby wyjaśnić: Oczywiście mógłbym po prostu usunąć punkt przerwania z mojego kodu źródłowego. Ale wymagałoby to opuszczenia debuggera i ponownego uruchomienia. Często trzeba dużo pracy, aby dostać się gdzieś i ponowne uruchomienie debuggera sprawia, że ​​życie jest trudniejsze. Również jeśli istnieje wielka pętla i chcesz sprawdzić obiekty w pętli, najłatwiej jest umieścić punkt przerwania w pętli bezpośrednio za obiektem. Jak mogłem pominąć pętlę (i wszystkie tysiące połączeń set_trace()) i przejść przez kod po pętli, używając next?

+1

Punkty przerwania służą tylko do debugowania, Dobrze jest śledzić ustawienia _where_, które ustawiłeś. Lepiej rób 'grep' lub szukaj, aby dowiedzieć się, gdzie to jest. – karthikr

+0

@karthikr Tak, oczywiście. Myślę, że źle zrozumiałeś moje pytanie. Próbowałem wyjaśnić, w jaki sposób chciałbym użyć debuggera. – lumbric

Odpowiedz

-2

Uruchomienie programu powinno również informować Cię dokładnie o tym, gdzie ustawiłeś swój idb.set_trace(), gdy jest on trafiany (w przeciwnym razie spróbuj wykonać polecenia where lub bt). Następnie możesz usunąć tę linię z pliku i ponownie uruchomić program.

W przeciwnym razie przydatne może okazać się użycie this, jeśli czujesz się bardziej eksperymentalnie.

31

Cóż, możesz wykorzystać fakt, że wszystko w Pythonie jest obiektem. Podczas gdy w debugger, można zrobić coś takiego:

def f(): pass 
ipdb.set_trace = f 

set_trace nadal będzie się nazywać, ale to nic nie da. Oczywiście, to trochę trwały, ale można po prostu zrobić

reload ipdb 

a dostaniesz oryginalne zachowanie powrotem.

(dlaczego miałbyś to zrobić, gdy przypadkowo umieścisz punkt przerwania w często nazywanej funkcji, która zwykle jest wywoływana pod spróbuj/except.) Po zdaniu sobie sprawy, że zatrzymujesz się 1000 razy w tej funkcji, próbujesz ctrl -c, ale zostaje złapany przez try/z wyjątkiem i jesteś z powrotem w ipdb ponownie Tak więc, jeśli jesteś w kodzie niskopoziomowych, upewnij się, że set_traces mieć jakiś kontekst.

if myvar in ['some', 'sentinel', 'values']: 
    ipdb.set_trace() 

etc.

+1

+1 za świetną sugestię po prostu zastąpienia 'set_trace()'. W każdym razie nie pozwala to na usunięcie określonego punktu przerwania. – lumbric

+2

powinno być możliwe rozszerzenie tej koncepcji w celu wyeliminowania pojedynczego punktu przerwania, za pomocą modułu inspect w celu ustalenia bieżącego pliku/linii i albo powrotu (bezczynności) lub wywołania oryginalnego pliku ipdb.set_trace().Nie mam przepisu, ale użyłem tego kilka razy, więc to jest inspirujące, aby je połączyć ... –

+4

To przydarza mi się trochę podczas pracy z pakietami testowymi. Jeśli utknąłeś i po prostu chcesz, aby powrócił twój shell, prosty 'del ipdb.set_trace' działa jak urok. –

9

Po zapoznaniu się z Corley

ipdb.set_trace = lambda: None 

Działa dla mnie.

Powiązane problemy