Cách đơn giản hơn để đặt các điểm ngắt PDB trong mã Python?


105

Chỉ là một câu hỏi tiện lợi. Tôi đã hơi hỏng với các trình gỡ lỗi trong IDE như Visual Studio và XCode. Tôi thấy hơi vụng về khi phải nhập import pdb; pdb.set_trace()để đặt điểm ngắt (tôi không muốn nhập pdb ở đầu tệp vì tôi có thể quên và để lại nó).

Có cách nào đơn giản hơn để thiết lập điểm ngắt trong mã Python, đơn giản và không phô trương như những gì bạn thấy trong IDE không?


Sử dụng PyCharm. Làm thế nào nó có thể đơn giản hơn việc nhập một dòng điểm ngắt, ngoại trừ việc chạy bằng Python IDE?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Chỉ cần sử dụng python -m pdb <your_script>.py then b <line_number>để đặt điểm ngắt ở số dòng đã chọn (không có dấu ngoặc đơn của hàm). Nhấn cđể tiếp tục đến điểm ngắt của bạn. Bạn có thể xem tất cả các điểm ngắt của mình bằng blệnh của chính nó. Nhập helpđể xem các lệnh pdb khác có sẵn trong khi gỡ lỗi.
arcseldon

1
Kể từ Python 3.7, bây giờ bạn có thể sử dụng breakpoint()hàm nội trang . python.org/dev/peps/pep-0553
Daniel

Câu trả lời:


117

Bạn có thể chạy chương trình của mình vào pdbtừ dòng lệnh bằng cách chạy

python -m pdb your_script.py

Nó sẽ ngắt ở dòng đầu tiên, sau đó bạn sẽ có thể thêm một điểm ngắt vào bất cứ nơi nào bạn muốn trong mã của mình bằng breaklệnh, cú pháp của nó là:

b (reak) [[tên tệp:] lineno | hàm [, điều kiện]]

Nó đủ linh hoạt để cung cấp cho bạn khả năng thêm điểm ngắt ở bất kỳ đâu.


24
để làm rõ điểm này, nếu tôi pdb.set_trace()và vào trình gỡ lỗi, sử dụng llệnh (danh sách) và thấy rằng tôi muốn đặt điểm ngắt ở dòng 27, thì tôi sẽ nhập: b 27và trình gỡ lỗi sẽ đặt điểm ngắt ở dòng 27 (tôi thấy tài liệu khó hiểu một chút, vì vậy muốn thêm điểm làm rõ).
benjaminmg trong

9
Ngoài ra, nếu bạn có một đối tượng xvà bạn muốn dừng khi phương thức của nó fđược gọi, bạn có thể nói break x.f, sau đó c(ontinue). Điều này hoạt động ngay cả khi đối tượng nằm trong một tệp không thể truy cập được hoặc được tạo động, ví dụ như bằng cách bỏ chọn.
osa

2
Khi gỡ lỗi sau một stacktrace, bạn có thể sao chép đường dẫn đầy đủ vào một mô-đun và thêm số dòng nhưb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
hợp lệ vào

58

Bạn có thể dùng:

from pdb import set_trace as bp

code
code
bp()
code
code

không chắc tại sao lại có răng cưa superflous, nhưng ;-). Vì một số lý do IDE / Editor (vscode) của tôi là một con ngựa cái AM này và tiếp tục gạch chân. Thấy bình luận của bạn thực sự đã giúp tôi. Có một ngày tuyệt vời!
MrMesees

Cảm ơn bạn rất nhiều!
mooreds

Làm cách nào để set_tracechỉ bắt buộc nhập khi tôi sử dụng bp ()?
alper

39

Trong vim, tôi có một macro được thiết lập cho việc này (trong tệp .vimrc của tôi):

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

vì vậy tôi có thể chỉ cần nhấn \ b (khi không ở trong Chế độ chèn) và nó thêm một điểm ngắt sau dòng hiện tại hoặc \ B (lưu ý viết hoa) và nó đặt một điểm trước dòng hiện tại.

mà dường như hoạt động ổn. Hầu hết các trình soạn thảo lập trình 'đơn giản' khác (emacs, sublimetext, v.v.) sẽ có những cách dễ dàng tương tự để thực hiện việc này.

Chỉnh sửa: Tôi thực sự có:

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>

chỉ bật nó cho các tệp nguồn python. Bạn có thể dễ dàng thêm các dòng tương tự cho javascript hoặc bất kỳ ngôn ngữ nào khác mà bạn sử dụng.

Bản cập nhật 2019 (Python 3.7+)

Python 3.7+ hiện có nội trang breakpoint()có thể thay thế nội trang trước đó import pdb; pdb.set_trace()trong vim. Nó vẫn hoạt động như cũ.


2
Giải pháp tốt và dòng được thêm vào cũng sẽ có thụt lề chính xác nếu bạn có set autoindenttrong tệp .vimrc của mình .
Jealie

Vâng, tôi không thể hiểu tại sao hầu hết các bản phân phối không được cung cấp set autoindent(và một loạt các tùy chọn khác) theo tiêu chuẩn. Một trong những điều đầu tiên tôi làm với một hệ thống mới là kéo trong một vimrc tốt hơn ...
Daniel

1
Chỉ cần sử dụng một đăng ký có tên vim! Lưu dòng mà bạn muốn đệm 'd' (như trong d ebug) bằng cách nhấn "dyyvà bất cứ khi nào bạn cần, chỉ cần thực hiện "dphoặc "dP. Tìm hiểu đăng ký vim ! Chúng rất hữu ích và luôn được hỗ trợ!
polvoazul

làm thế nào để thêm: w sau đó?
ji-ruh

Lấy khái niệm thanh ghi được đặt tên xa hơn một chút, bạn có thể ghi macro, thực hiện các thao tác cần thiết và sau đó dừng macro. Sau đó dán nội dung macro vào tệp vimrc của bạn. Ví dụ: bắt đầu macro bằng qd, rồi sau đó "dpđể dán. Cuối cùng, chỉ định hướng dẫn của bạn vào một sổ đăng ký để luôn được điền vào tải lên vim. Ví dụ: let @d = 'oimport pdb; pdb.set_trace()k0:w' Bây giờ, chỉ cần sử dụng @dbất cứ khi nào bạn muốn dán dòng vào tệp. Ở trên cũng lưu tệp. Nhưng bạn sẽ phải ghi lại của riêng mình (thay vì sao chép / dán ở trên) vì các ký tự đặc biệt có liên quan (cho thoát, v.v.).
arcseldon

27

Nếu bạn không muốn đặt các điểm ngắt theo cách thủ công mỗi khi chạy chương trình (trong Python 3.2+), ví dụ: giả sử bạn muốn trực tiếp tạo một điểm ngắt ở dòng 3 và dừng thực thi ở đó:

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

Thông tin sau có thể giúp:

Nếu tệp .pdbrc tồn tại trong thư mục chính của người dùng hoặc trong thư mục hiện tại, tệp đó sẽ được đọc và thực thi như thể nó đã được nhập tại dấu nhắc trình gỡ lỗi. Điều này đặc biệt hữu ích cho bí danh. Nếu cả hai tệp đều tồn tại, tệp trong thư mục chính sẽ được đọc trước tiên và các bí danh được xác định ở đó có thể bị tệp cục bộ ghi đè.

Đã thay đổi trong phiên bản 3.2: .pdbrc hiện có thể chứa các lệnh tiếp tục gỡ lỗi, chẳng hạn như tiếp tục hoặc tiếp theo. Trước đây, các lệnh này không có hiệu lực.

Tính năng mới trong phiên bản 3.2: pdb.py hiện chấp nhận tùy chọn -c thực thi các lệnh như thể được đưa ra trong tệp .pdbrc, hãy xem Lệnh gỡ lỗi.



10

Đây là cách bạn sẽ sử dụng pdb trong dòng lệnh mà không cần triển khai bất kỳ thứ gì trong mã nguồn của bạn (tài liệu và các tài nguyên trực tuyến khác không giải thích tốt điều này cho một lập trình viên trước đây chỉ sử dụng trình gỡ lỗi trực quan):

Bắt đầu pdb bằng cách nhập nội dung sau vào dấu nhắc trình bao:

python -m pdb 'python_script'

Lệnh này khởi tạo pdb và trình gỡ lỗi pdb sẽ ngắt ở dòng đầu tiên của python_script của bạn và đợi bạn nhập:

(Pdb)

Đây là giao diện để giao tiếp với trình gỡ lỗi. Bây giờ, bạn có thể chỉ định các lệnh của mình tại đây. Không phản đối việc sử dụng các nút hoặc phím tắt trong trình gỡ lỗi trực quan, ở đây bạn sẽ sử dụng các lệnh để thu được kết quả tương tự.

Bạn có thể chuyển đến dòng tiếp theo trong mã của mình bằng lệnh "n" (tiếp theo):

(Pdb) n

Thực hiện tiếp theo sẽ hiển thị số dòng và mã cụ thể trong nguồn:

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

Bạn có thể đặt điểm ngắt bằng cách chỉ định số dòng trong mã nguồn của mình.

(Pdb) b 50

Ở đây, trình gỡ lỗi được đặt để ngắt ở dòng 50. Nếu không có bất kỳ điểm ngắt nào khác, điểm ngắt ở dòng 50 sẽ là điểm đầu tiên và nó có thể được tham chiếu bởi id điểm ngắt là 1 trong trường hợp này. Nếu bạn thêm nhiều điểm ngắt, chúng sẽ nhận được số nhận dạng tuần tự (tức là, 2, 3, v.v.)

Khi một điểm ngắt được thiết lập, bạn sẽ tiếp tục thực hiện chương trình của mình cho đến khi pdb đến điểm ngắt như sau:

(Pdb) c

Khi bạn đến một điểm ngắt, bạn có thể chuyển sang dòng tiếp theo, với lệnh n như đã mô tả trước đó. Nếu bạn muốn kiểm tra giá trị của các biến, bạn sẽ thực hiện lệnh tham số như sau:

(Pdb) p variable_name

Nếu bạn không cần một điểm ngắt nữa, bạn có thể xóa nó bằng cách chuyển vào id của điểm ngắt bằng lệnh clear:

(Pdb) clear 1

Cuối cùng, khi bạn hoàn tất với trình gỡ lỗi, bạn có thể thoát khỏi quá trình thực thi như thoát trình thông dịch dòng lệnh python.

(Pdb) exit()

Tôi hy vọng điều này sẽ giúp bất kỳ ai bắt đầu với pdb. Đây là danh sách các lệnh bạn có thể sử dụng với trình gỡ lỗi: pdb so câu hỏi và câu trả lời



4

Bạn có thể sử dụng IDE hỗ trợ gỡ lỗi python hoặc bạn có thể kiểm tra công cụ Winpdb tuyệt vời. Hoạt động trên bất kỳ nền tảng nào và cung cấp phương tiện gỡ lỗi đồ họa cho tập lệnh python của bạn.

http://winpdb.org/


2

Bạn có thể dùng:

  • lý tưởng cánh
  • nhật thực với plugin pydev
  • pycharms

Tất cả những điều trên đều hỗ trợ gỡ lỗi python từ bên trong IDE.


0

Trong Atom nếu các plugin Python được cài đặt, bạn chỉ cần nhập ' pdb' và nhấn enter và đoạn mã sẽ nhập nhập và truy xuất lại cho bạn.

Bây giờ tôi đã quen với điều này rằng đôi khi tôi chỉ cần nhập nó ngay cả khi tôi đang chỉnh sửa nó trong vim và chờ trình đơn thả xuống xuất hiện.


0

Một phương pháp được đánh giá thấp là đặt điểm ngắt trong pdb trực tiếp:

pdb> b torch/__init__:10

sẽ đặt một điểm dừng vào site-packages\torch\__init__.py:10

Sau đó pdb> csẽ dừng lại trên điểm ngắt này.

Sau đây cũng hợp lệ:

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

Xem tài liệu để biết chi tiết.


0

Bạn có thể sử dụng Vim với plugin Python-Mode hoặc Emacs với plugin Elpy .

Các plugin này cung cấp cho bạn các điểm ngắt bằng cách nhấn phím dễ dàng ( \ btrong Vim và C-c C-u btrong Emacs) cộng với nhiều tính năng khác từ các IDE nặng (gấp mã, tái cấu trúc, kẻ viền, v.v.) - tất cả đều nằm trong trình soạn thảo văn bản dựa trên thiết bị đầu cuối nhẹ.


-1

Cách đơn giản nhất để chạy trình gỡ lỗi trên tập lệnh của bạn chỉ là

pdb your_script.py

Chạy pdb trên dòng lệnh Linux mang lại

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

Làm thế nào để cài đặt pdb? Hay từ đâu?
kenorb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.