Prostszy sposób umieszczania punktów przerwania PDB w kodzie Pythona?


105

To tylko wygodne pytanie. Byłem trochę zepsuty debugerami w IDE, takie jak Visual Studio i XCode. Uważam, że to trochę niezręczne, aby wpisać, import pdb; pdb.set_trace()aby ustawić punkt przerwania (wolałbym nie importować pdb na początku pliku, ponieważ mógłbym zapomnieć i zostawić go).

Czy istnieje prostszy sposób ustawiania punktu przerwania w kodzie Pythona, tak prosty i dyskretny, jak to, co widzisz w IDE?


Użyj PyCharm. Jak to może być prostsze niż wpisanie wiersza punktu przerwania, z wyjątkiem uruchamiania przy użyciu Python IDE?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Po prostu użyj python -m pdb <your_script>.py następnie, b <line_number>aby ustawić punkt przerwania na wybranym numerze linii (bez nawiasów funkcji). Naciśnij, caby przejść do punktu przerwania. Możesz zobaczyć wszystkie swoje punkty przerwania za bpomocą samego polecenia. Wpisz, helpaby zobaczyć inne polecenia pdb dostępne podczas debugowania.
arcseldon

1
Od wersji Python 3.7 można teraz używać breakpoint()funkcji wbudowanej . python.org/dev/peps/pep-0553
Daniel,

Odpowiedzi:


117

Możesz uruchomić swój program pdbz wiersza poleceń, uruchamiając

python -m pdb your_script.py

Zepsuje się w pierwszym wierszu, a następnie będziesz mógł dodać punkt przerwania w dowolnym miejscu w kodzie za pomocą breakpolecenia, jego składnia to:

b (reak) [[nazwa pliku:] lineno | funkcja [, warunek]]

Jest na tyle elastyczny, że daje możliwość dodania punktu przerwania w dowolnym miejscu.


24
aby wyjaśnić ten punkt, jeśli pdb.set_trace()wejdę do debugera, użyj lpolecenia (listy) i zobaczę, że chcę ustawić punkt przerwania w linii 27, wtedy wpisałbym: b 27a debugger ustawiłby punkt przerwania w linii 27 (znalazłem dokumentacja jest trochę trudna do zrozumienia, dlatego chciałem dodać ten punkt wyjaśnienia).
benjaminmgross

9
Ponadto, jeśli masz obiekt xi chcesz zatrzymać się, gdy fwywoływana jest jego metoda , możesz powiedzieć break x.f, a następnie c(ontinue). Działa to nawet wtedy, gdy obiekt znajduje się w niedostępnym pliku lub został utworzony dynamicznie, np. Przez rozpakowanie.
osa

2
Podczas debugowania po stosie śledzenia możesz skopiować pełną ścieżkę do modułu i dołączyć numer linii, na przykładb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
obowiązuje od

58

Możesz użyć:

from pdb import set_trace as bp

code
code
bp()
code
code

Nie wiem, po co zbędne aliasing, ale ;-). Z jakiegoś powodu moje IDE / Editor (vscode) było klaczą tego AM i ciągle to podkreśla. Twój komentarz naprawdę mi pomógł. Miłego dnia!
MrMesees

Dziękuję bardzo!
zacumuje

Jak mogę wymusić import set_tracetylko wtedy, gdy używam bp ()?
Alper

39

W vimie mam ustawione makro (w moim pliku .vimrc):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

więc mogę po prostu nacisnąć \ b (gdy nie jest w trybie wstawiania) i dodaje punkt przerwania po bieżącej linii lub \ B (zwróć uwagę na wielką literę) i umieszcza jeden przed bieżącą linią.

który wydaje się działać dobrze. Większość innych „prostych” edytorów programistów (emacs, sublimetext, itp.) Powinno mieć podobne łatwe sposoby na zrobienie tego.

Edycja: faktycznie mam:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

który włącza go tylko dla plików źródłowych Pythona. Możesz bardzo łatwo dodać podobne wiersze dla javascript lub innych używanych języków.

Aktualizacja 2019 (Python 3.7+)

Python 3.7+ ma teraz wbudowane, breakpoint()które może zastąpić poprzednie import pdb; pdb.set_trace()w vimie. Nadal działa tak samo.


2
Niezłe rozwiązanie, a dodana linia będzie miała również prawidłowe wcięcie, jeśli masz set autoindentw swoim pliku .vimrc .
Jealie

Tak, nie mogę zrozumieć, dlaczego większość dystrybucji nie jest dostarczana z set autoindent(i kilkoma innymi opcjami) w standardzie. Jedną z pierwszych rzeczy, które robię z nowym systemem, jest użycie lepszego vimrc ...
Daniel

1
Po prostu użyj vima o nazwie register! Zapisz wiersz, który chcesz zbuforować 'd' (jak w d ebug), naciskając, "dyya kiedy potrzebujesz, po prostu zrób "dplub "dP. Naucz się rejestrów VIM ! Są bardzo przydatne i zawsze są obsługiwane!
polvoazul

jak dodać: po czym?
ji-ruh

Idąc nieco dalej z koncepcją nazwanych rejestrów, możesz nagrać makro, wykonać niezbędne operacje, a następnie zatrzymać makro. Następnie wklej zawartość makra do swojego pliku vimrc. Na przykład uruchom makro z qd, a później, "dpaby wkleić. Na koniec przypisz swoje instrukcje do rejestru, który jest zawsze wypełniany przy ładowaniu vima. Przykład: let @d = 'oimport pdb; pdb.set_trace()k0:w' Teraz po prostu użyj, @dkiedy chcesz wkleić linię do pliku. Powyższe również zapisuje plik. Ale będziesz musiał nagrać swój własny (zamiast kopiować / wklejać powyżej), ponieważ wymagane są specjalne znaki (dla ucieczki itp.).
arcseldon

27

Jeśli nie chcesz ręcznie ustawiać punktów przerwania za każdym razem, gdy uruchamiasz program (w Pythonie 3.2+), np. Powiedz, że chcesz bezpośrednio utworzyć punkt przerwania w linii 3 i tam zatrzymać wykonywanie:

python -m pdb -c "b 3" -c c your_script.py

Poniższe informacje mogą pomóc:

Jeśli plik .pdbrc istnieje w katalogu domowym użytkownika lub w katalogu bieżącym, jest on wczytywany i wykonywany tak, jakby został wpisany w wierszu polecenia debugera. Jest to szczególnie przydatne w przypadku aliasów. Jeśli istnieją oba pliki, najpierw odczytywany jest ten z katalogu domowego, a zdefiniowane w nim aliasy mogą zostać zastąpione przez plik lokalny.

Zmienione w wersji 3.2: .pdbrc może teraz zawierać polecenia kontynuujące debugowanie, takie jak kontynuuj lub następny. Wcześniej te polecenia nie działały.

Nowość w wersji 3.2: pdb.py akceptuje teraz opcję -c, która wykonuje polecenia tak, jakby były podane w pliku .pdbrc, zobacz Polecenia debugera.


23

Jeszcze tego nie próbowałem, ale właśnie zaimplementowali nowy wbudowany punkt przerwania () w Pythonie 3.7, co oznacza, że ​​możesz teraz wstawić punkt przerwania za pomocą jednej instrukcji:

breakpoint()

1
Od wersji Python 3.7 to jest odpowiedź.
eric

10

Oto jak użyłbyś pdb w linii poleceń bez implementowania czegokolwiek w kodzie źródłowym (dokumentacja i inne zasoby online nie radzą sobie dobrze, wyjaśniając to programiście, który w przeszłości używał tylko wizualnych debuggerów):

Uruchom pdb, wpisując w zachęcie powłoki:

python -m pdb 'python_script'

To polecenie inicjuje pdb, a debugger pdb przerwie pierwszy wiersz twojego python_script i zaczeka na dane wejściowe od ciebie:

(Pdb)

To jest interfejs do komunikacji z debugerem. Teraz możesz określić swoje polecenia tutaj. W przeciwieństwie do używania przycisków lub skrótów klawiaturowych w wizualnych debugerach, tutaj użyjesz poleceń, aby uzyskać te same wyniki.

Możesz przejść do następnej linii w kodzie poleceniem „n” (dalej):

(Pdb) n

Wykonanie next wyświetli numer linii i określony kod w źródle:

> python_script(line number)method name
-> current line in the source code

Możesz ustawić punkt przerwania, określając numer wiersza w kodzie źródłowym.

(Pdb) b 50

W tym przypadku debugger jest ustawiony na przerwanie w linii 50. Jeśli nie ma innych punktów przerwania, punkt przerwania w linii 50 będzie pierwszym i można się do niego odwołać za pomocą identyfikatora punktu przerwania, który w tym przypadku wynosi 1. Jeśli dodasz więcej punktów przerwania, otrzymają identyfikatory sekwencyjnie (tj. 2, 3 itd.)

Po ustawieniu punktu przerwania będziesz kontynuować wykonywanie programu, dopóki pdb nie osiągnie punktu przerwania w następujący sposób:

(Pdb) c

Gdy dojdziesz do punktu przerwania, możesz przejść do następnej linii za pomocą polecenia n, jak opisano wcześniej. Jeśli chcesz sprawdzić wartości zmiennych, wykonaj polecenie parametru w następujący sposób:

(Pdb) p variable_name

Jeśli nie potrzebujesz już punktu przerwania, możesz go wyczyścić, przekazując identyfikator punktu przerwania za pomocą polecenia clear:

(Pdb) clear 1

Wreszcie, kiedy skończysz z debugerem, możesz zakończyć wykonywanie, tak jak zamknąłbyś interpreter wiersza poleceń Pythona.

(Pdb) exit()

Mam nadzieję, że pomoże to każdemu rozpocząć pracę z PDB. Oto lista poleceń, których możesz użyć z debugerem: pdb, więc pytanie i odpowiedzi



4

Możesz użyć IDE, które obsługuje debugowanie Pythona lub możesz sprawdzić doskonałe narzędzie Winpdb. Który działa na każdej platformie i zapewnia graficzne możliwości debugowania skryptu w Pythonie.

http://winpdb.org/


2

Możesz użyć:

  • skrzydło ide
  • eclipse za pomocą wtyczki pydev
  • pycharms

Wszystkie powyższe obsługują debugowanie Pythona z wnętrza IDE.


0

W Atom, jeśli są zainstalowane wtyczki Pythona, możesz po prostu wpisać „ pdb” i nacisnąć Enter, a fragment kodu napisze import i śledzenie wstecz.

Przyzwyczaiłem się do tego teraz, że czasami po prostu go wpisuję, nawet jeśli edytuję go w vimie i czekam, aż pojawi się lista rozwijana.


0

Niedocenianą metodą jest bezpośrednie ustawienie punktu przerwania w pdb:

pdb> b torch/__init__:10

ustawi punkt przerwania na site-packages\torch\__init__.py:10

Następnie pdb> czatrzyma się na tym punkcie przerwania.

Poniższe są również ważne:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

Szczegółowe informacje można znaleźć w dokumencie .


0

Możesz użyć Vima z wtyczką Python-Mode lub Emacsa z wtyczką Elpy .

Te wtyczki zapewniają punkty przerwania z łatwymi naciśnięciami klawiszy ( \ bw Vimie i C-c C-u bEmacs) oraz wiele innych funkcji z ciężkich IDE (składanie kodu, refaktoryzacja, linting itp.) - wszystko w lekkim edytorze tekstu opartym na terminalu.


-1

Najprostszym sposobem uruchomienia debugera w skrypcie jest po prostu

pdb your_script.py

Uruchomienie pdb w linii poleceń Linuksa daje

usage: pdb.py scriptfile [arg] ...

Jak zainstalować pdb? Albo skąd?
kenorb
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.