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


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

Có cách nào đơn giản hơn để thiết lập một đ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 một IDE không?


76
2017-08-08 10:24


gốc




Các câu trả lời:


Bạn có thể chạy chương trình của bạn pdb từ dòng lệnh bằng cách chạy

python -m pdb your_script.py

Nó sẽ phá vỡ trên dòng đầu tiên, sau đó bạn sẽ có thể thêm một breakpoint bất cứ nơi nào bạn muốn trong mã của bạn bằng cách sử dụng break lệ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 cứ nơi nào.


93
2017-08-08 10:31



để làm rõ điểm này, nếu tôi pdb.set_trace() và đi vào trình gỡ rối, hãy sử dụng l lệnh (danh sách) và thấy rằng tôi muốn thiết lập một điểm ngắt tại dòng 27, sau đó tôi sẽ nhập: b 27 và trình gỡ lỗi sẽ đặt điểm ngắt tại dòng 27 (tôi thấy tài liệu hơi khó hiểu, vì vậy muốn thêm điểm làm rõ). - benjaminmgross
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 là, bạn có thể nói break x.f, và sau đó c(ontinue). Công cụ này hoạt động ngay cả khi đối tượng ở trong tệp không thể truy cập hoặc được tạo động, ví dụ: bằng cách bỏ ghim. - osa
Khi gỡ lỗi sau một stacktrace, bạn có thể sao chép fullpath vào một module và nối thêm số dòng như b /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596 - valid


Bạn có thể dùng:

from pdb import set_trace as bp

code
code
bp()
code
code

38
2018-02-24 13:56





Trong vim, tôi có một thiết lập vĩ mô cho điều này (trong tập tin .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 chỉ có thể nhấn \ b (khi không ở chế độ chèn) và nó thêm vào một điểm ngắt sau dòng hiện tại, hoặc \ B (lưu ý số vốn) và nó đặt một điểm trước dòng hiện tại.

mà dường như làm việc ổn. Hầu hết các biên tập viên lập trình 'đơn giản' khác (emacs, sublimetext, v.v.) nên có những cách tương tự dễ dàng để 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>

nó chỉ bật 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.


29
2017-10-28 11:51



Giải pháp tốt đẹp và dòng được thêm vào cũng sẽ có sự thụt lề chính xác nếu bạn có set autoindenttrong của bạn .vimrc tập tin. - Jealie
Có, tôi không thể hiểu tại sao hầu hết các distro không giao hàng với set autoindent (và một loạt các tùy chọn khác) như là 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 vimrc tốt hơn ... - Daniel
Chỉ cần sử dụng một vim tên đăng ký! Lưu dòng mà bạn muốn đệm 'd' (như trong debug) bằng cách nhấn "dyy và bất cứ khi nào bạn cần nó chỉ cần làm "dp hoặc là "dP. Học hỏi đă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


Nếu bạn không muốn đặt các điểm ngắt theo cách thủ công mỗi lần chạy chương trình (bằng Python 3.2+), ví dụ: nói rằng bạn muốn trực tiếp tạo điểm ngắt tại dòng 3 và dừng thực hiện ở đó:

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

Các thông tin sau đây 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, nó được đọc và được thực hiện như thể nó đã được gõ vào dấu nhắc trình gỡ lỗi. Điều này đặc biệt hữu ích cho các bí danh. Nếu cả hai tệp tồn tại, một tệp trong thư mục chính được đọc trước và các bí danh được xác định có thể được ghi đè bởi tệp cục bộ.

Thay đổi trong phiên bản 3.2: .pdbrc giờ đây 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.

Mới trong phiên bản 3.2: pdb.py bây giờ chấp nhận tùy chọn -c thực thi các lệnh như được đưa ra trong tệp .pdbrc, xem Lệnh Debugger.


16
2017-11-19 15:42





Đây là cách bạn sẽ sử dụng pdb trong dòng lệnh mà không cần thực hiện 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 làm tốt công việc này cho một lập trình viên chỉ sử dụng trình gỡ lỗi trực quan trong quá khứ):

Bắt đầu pdb bằng cách gõ như sau trong 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ẽ phá vỡ dòng đầu tiên của python_script của bạn và chờ một đầu vào từ bạn:

(Pdb)

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

Bạn có thể đi đến dòng tiếp theo trong mã của bạn 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 một số dòng trong mã nguồn của bạn.

(Pdb) b 50

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

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

(Pdb) c

Một khi bạn nhận được một breakpoint bạn có thể đi đến dòng tiếp theo, với lệnh n như mô tả trước đây. Nếu bạn muốn kiểm tra các giá trị của các biến, bạn sẽ thực thi lệnh tham số như sau:

(Pdb) p variable_name

Nếu bạn không còn cần một breakpoint nữa, bạn có thể xóa nó bằng cách truyền vào id của breakpoint bằng lệnh rõ ràng:

(Pdb) clear 1

Cuối cùng, khi bạn đang thực hiện với trình gỡ lỗi, bạn có thể thoát khỏi việc thực hiện khi bạn thoát khỏi 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 mọi người bắt đầu với pdb. Dưới đây là danh sách các lệnh bạn có thể sử dụng với trình gỡ lỗi: pdb để câu hỏi và câu trả lời


8
2017-08-16 20:06





Bạn có thể sử dụng một 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 các phương tiện gỡ lỗi đồ họa cho tập lệnh python của bạn.

http://winpdb.org/


4
2017-08-08 10:26





Tôi chưa thử nó nhưng họ chỉ thực hiện một điểm ngắt được gọi là mới () trong Python 3.7 có nghĩa là bạn có thể chèn một điểm ngắt với một câu lệnh ngay bây giờ:

breakpoint()

3
2018-03-23 00:26





Bạn có thể dùng:

  • wing ide
  • nhật thực với plugin pydev
  • pycharms

Tất cả các hỗ trợ python ở trên được gỡ lỗi từ bên trong một IDE.


2
2017-08-08 10:30





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

Tôi đã sử dụng để bây giờ mà đôi khi tôi chỉ cần gõ nó ngay cả khi tôi đang chỉnh sửa nó trong vim và chờ đợi thả xuống xuất hiện.


0
2018-05-07 22:56





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

pdb your_script.py

Chạy pdb trên một dòng lệnh Linux cho

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

-1
2018-02-07 06:43



Cài đặt thế nào pdb? Hay từ đâu? - kenorb