Làm thế nào để thoát pdb và cho phép chương trình tiếp tục?


111

Tôi đang sử dụng mô-đun pdb để gỡ lỗi một chương trình. Tôi muốn hiểu cách tôi có thể thoát pdb và cho phép chương trình tiếp tục trở đi cho đến khi hoàn thành. Chương trình tốn kém về mặt tính toán để chạy, vì vậy tôi không muốn thoát ra mà không cố gắng hoàn thành tập lệnh. continuedường như không hoạt động. Làm cách nào để thoát pdb và tiếp tục với chương trình của tôi?


2
continuethoát khỏi vòng lặp, returnthoát khỏi phương thức / chức năng
Stephan

7
@Stephan: Anh ấy đang nói về continue, lệnh pdb. Không phải là câu lệnh Python.
voithos

1
@turtle: continuenên "Tiếp tục thực hiện, chỉ dừng lại khi gặp điểm ngắt", theo tài liệu. Bạn có bộ điểm dừng đang bị tấn công không?
voithos

1
Ah. được rồi, tôi hiểu rồi. vâng, tôi có một điểm ngắt được đặt bên trong một vòng lặp. Còn đường nào để vòng lại chỗ đó không? vòng lặp được gọi hàng nghìn lần, vì vậy tôi không thể tiếp tục nhấn tiếp tục theo cách thủ công.
rùa,

1
@turtle: Bạn có đặt điểm ngắt từ bên trong Pdb hay bạn có pdb.set_trace()mã nguồn trong mã nguồn của mình không?
voithos

Câu trả lời:


190

continuenên "Tiếp tục thực hiện, chỉ dừng lại khi gặp điểm ngắt", vậy là bạn đã đặt điểm ngắt ở đâu đó. Để loại bỏ điểm ngắt (nếu bạn đã chèn nó theo cách thủ công):

(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

Hoặc, nếu bạn đang sử dụng pdb.set_trace(), bạn có thể thử điều này (mặc dù nếu bạn đang sử dụng pdb theo những cách lạ mắt hơn, điều này có thể phá vỡ mọi thứ ...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!

10
Ở trên không thoát pdb.
Steve Barnes

7
Về từ thứ 15 của câu hỏi!
Steve Barnes

13
@SteveBarnes: Tôi nghĩ bạn đang hiểu quá theo nghĩa đen. OP liên tục chạm vào một điểm dừng. Tất cả những gì họ cần là tiếp tục quá trình hoạt động lâu dài của mình mà không gặp phải các điểm dừng. Pdb có thực sự đang chạy hay không là điều không quan trọng.
voithos

35
Đẹp mẹo về thiết lập set_trace = lambda: None:)
randlet

2
Đối với những trường hợp cực đoan, không có gì đánh bại set_trace = lambda: None. Python org nên thêm một lệnh cho phép bạn thoát khỏi pdb.
ErezO

26

Một đơn giản Ctrl- Dsẽ thoát ra khỏi pdb. Nếu bạn muốn tiếp tục thay vì ngắt, chỉ cần nhấn cchứ không phải toàn bộ continuelệnh


6
Còn khi bạn đang ở trong một hàm, bên trong một vòng lặp thì sao? Nó dường như chỉ chuyển đến vòng lặp tiếp theo cho tôi và tôi thực sự không thể đóng pdb hoặc thậm chí đóng python mà không đóng toàn bộ thiết bị đầu cuối?
Marses

@LimokPalantaemon Weird, bạn đã thử gõ chưaexit
Minh Triết

Điều này không hoạt động nếu bạn đặt một dấu vết hoặc nếu bạn có các điểm ngắt, trừ khi bạn tiếp tục nhấn c.
Alex

lúng túng, nhưng điều này đã cứu tôi khỏi bị mắc kẹt quá lâu -_-
jmcg

7

Câu trả lời từ @voithos là đúng, vì vậy tôi sẽ chỉ thêm một phương án thay thế trong trường hợp bạn đang sử dụng set_trace. Có, bản pdb.set_trace = lambda: Nonehack hoạt động tốt, nhưng không nếu bạn đã đặt các điểm ngắt khác và muốn kích hoạt lại sau này. Đối với tôi, điều này chỉ ra thực tế là không may pdblà thiếu một loạt chức năng (ngay cả những thứ cơ bản như danh sách hiển thị) và đây là một trường hợp khác.

Tin tốt là đó pdb++là một sự thay thế tuyệt vời cho sự thay thế pdbvà một trong những điều mà nó giải quyết được chính xác là vấn đề vô hiệu hóa set_trace. Vì vậy, bạn có thể chỉ cần làm:

pip install pdbpp

và sau đó tại (Pdb++)lời nhắc, hãy nhập:

pdb.disable()

Nếu bạn muốn kích hoạt lại sau này, không ngạc nhiên khi điều này hoạt động:

pdb.enable()

Dễ dàng! Và bạn sẽ nhận được rất nhiều tính năng hữu ích khác trên đó.


4

Nếu bạn thực sự muốn thoát khỏi trình gỡ lỗi thì bạn cần chạy một cái gì đó như WinPdb cho phép bạn tách khỏi quy trình và sau đó thoát khỏi trình gỡ lỗi, (NB Nó là đa nền tảng).

Nếu bạn muốn tiếp tục gỡ lỗi nhưng không còn dừng lại ở một điểm ngắt nhất định thì bạn cần phải:

  1. Ghi lại số điểm ngắt, (hoặc tệp và số dòng),
  2. Hoặc cl bp_number hoặc clear file:line để loại bỏ vĩnh viễn các breakpoint hoặc disable pb_number tắt chế độ này nhưng có thể chuyển đổi nó trở lại.
  3. Sau đó, continuevà chạy chương trình của bạn cho đến khi sau đó tiếp theo khác nhau breakpoint là hit.

Để biết thêm chi tiết về những điều trên, hãy xem sách hướng dẫn .


0

tìm cách mới để thoát pdb mà không cần cài đặt bất cứ thứ gì: - khi chương trình bắt đầu chạy, nhấn ctrl + c, sau đó chuyển cửa sổ sang cửa sổ khác (bất kỳ cửa sổ nào), khi đó trình bao ban đầu với pdb đang chạy sẽ hiển thị như sau: (pdb) ..... - chuyển trở lại pdb, sau đó nhấn Enter, bây giờ bạn đã hoàn tất, trình bao lệnh pdb xuất hiện trở lại

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.