Jak wyjść z pdb i pozwolić programowi kontynuować?

111

Używam modułu pdb do debugowania programu. Chciałbym zrozumieć, jak mogę wyjść z pdb i pozwolić programowi na kontynuowanie aż do zakończenia. Uruchomienie programu jest kosztowne obliczeniowo, więc nie chcę wychodzić bez próby zakończenia skryptu. continuenie wydaje się działać. Jak mogę wyjść z pdb i kontynuować pracę z moim programem?

żółw
źródło
2
continueWychodzi z pętli, returnwychodzi z metod / funkcji
Stephan
7
@Stephan: Mówi o continuepoleceniu pdb. Nie instrukcja Pythona.
voithos
1
@turtle: continuepowinno "Kontynuować wykonywanie, zatrzymywać tylko po napotkaniu punktu przerwania", zgodnie z dokumentacją. Czy masz ustawiony punkt przerwania, który jest trafiony?
voithos
1
ah. dobra, widzę. tak, mam punkt przerwania ustawiony w pętli. tak czy inaczej, żeby to obejść? pętla jest wywoływana tysiące razy, więc nie mogę kontynuować ręcznie.
żółw
1
@turtle: Czy masz ustawiony punkt przerwania w Pdb, czy masz pdb.set_trace()w kodzie źródłowym?
voithos

Odpowiedzi:

190

continuepowinno „Kontynuować wykonywanie, zatrzymywać się tylko wtedy, gdy zostanie napotkany punkt przerwania”, więc gdzieś jest ustawiony punkt przerwania. Aby usunąć punkt przerwania (jeśli wstawiłeś go ręcznie):

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue

Lub, jeśli używasz pdb.set_trace(), możesz spróbować tego (chociaż jeśli używasz pdb w bardziej wyszukany sposób, może to zepsuć sprawę ...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
voithos
źródło
10
Powyższe nie powoduje wyjścia z pdb.
Steve Barnes
7
O piętnastym słowie pytania!
Steve Barnes
13
@SteveBarnes: Myślę, że bierzesz to zbyt dosłownie. OP tylko raz po raz uderza w punkt przerwania. Wszystko, czego potrzebują, to kontynuowanie długotrwałego procesu bez osiągania punktów przerwania. Nie ma znaczenia, czy Pdb faktycznie działa, czy nie.
voithos
35
Niezła wskazówka dotycząca ustawienia set_trace = lambda: None:)
randlet
2
W skrajnych przypadkach nic nie przebije set_trace = lambda: None. Python org powinien dodać polecenie, które po prostu pozwoli ci wyjść z pdb.
ErezO
26

Prosty Ctrl- Dwyrwie się z pdb. Jeśli chcesz kontynuować, a nie przerywać, po prostu naciśnij, ca nie całe continuepolecenie

Minh Triet
źródło
7
A co z sytuacją, gdy jesteś wewnątrz funkcji, wewnątrz pętli? Wydaje się, że po prostu przechodzi do następnej pętli, a nie mogę zamknąć pdb, a nawet pythona bez zamknięcia całego terminala?
Marses,
@LimokPalantaemon Dziwne, czy próbowałeś pisaćexit
Minh Triet
To nie działa, jeśli ustawisz ślad lub jeśli masz punkty przerwania, chyba że będziesz nadal naciskać c.
Alex
żenujące, ale to uchroniło mnie przed utknięciem na zbyt długo -_-
jmcg
7

Odpowiedź od @voithos jest poprawna, więc dodam tylko jedną alternatywę w przypadku, gdy używasz set_trace. Tak, pdb.set_trace = lambda: Nonehack działa poprawnie, ale nie, jeśli masz ustawione inne punkty przerwania i chcesz je później ponownie włączyć. Dla mnie wskazuje to na fakt, że niestety pdbbrakuje wielu funkcji (nawet podstawowych rzeczy, takich jak listy wyświetlania), a to jest inny przypadek.

Dobra wiadomość jest taka, że pdb++jest to świetny zamiennik pdb, a jedną z rzeczy, które rozwiązuje, jest właśnie problem wyłączania set_trace. Możesz więc po prostu zrobić:

pip install pdbpp

a następnie po (Pdb++)monicie wpisz:

pdb.disable()

Jeśli chcesz ponownie włączyć później, nic dziwnego, że działa to:

pdb.enable()

Łatwo! Oprócz tego otrzymasz wiele innych przydatnych gadżetów.

Adam Spiers
źródło
4

Jeśli naprawdę chcesz wyjść z debugera, musisz uruchomić coś takiego jak WinPdb, które pozwala odłączyć się od procesu, a następnie wyjść z debugera (NB jest to wieloplatformowe).

Jeśli chcesz kontynuować debugowanie, ale nie zatrzymywać się już w danym punkcie przerwania, musisz:

  1. Zanotuj numer punktu przerwania (lub plik i numer linii),
  2. Albo cl bp_number albo clear file:line , aby trwale usunąć punkt przerwania lub disable pb_number , aby włączyć go, ale być w stanie włączyć je z powrotem.
  3. Następnie continuei twój program działa do tego momentu trafia następny inny punkt przerwania.

Więcej szczegółów na temat powyższego znajduje się w instrukcji .

Steve Barnes
źródło
0

znajdź nowy sposób na wyjście z pdb bez instalowania czegokolwiek: - gdy program zacznie działać, naciśnij ctrl + c, a następnie przełącz okno na inne (dowolne okno), wtedy oryginalna powłoka z uruchomionym pdb powinna pokazać coś takiego: (pdb) ..... - przełącz się z powrotem na pdb, a następnie naciśnij Enter, teraz wszystko gotowe, powłoka poleceń pdb pojawia się ponownie

BrainAtom
źródło