pdb --- Trình gỡ lỗi Python¶
Source code: Lib/pdb.py
Mô-đun pdb xác định trình gỡ lỗi mã nguồn tương tác cho các chương trình Python. Nó hỗ trợ thiết lập các điểm dừng (có điều kiện) và từng bước ở cấp dòng nguồn, kiểm tra khung ngăn xếp, liệt kê mã nguồn và đánh giá mã Python tùy ý trong ngữ cảnh của bất kỳ khung ngăn xếp nào. Nó cũng hỗ trợ gỡ lỗi sau khi chết và có thể được gọi dưới sự kiểm soát của chương trình.
Trình gỡ lỗi có thể mở rộng -- nó thực sự được định nghĩa là lớp Pdb. Điều này hiện không có giấy tờ nhưng dễ hiểu bằng cách đọc nguồn. Giao diện mở rộng sử dụng các mô-đun bdb và cmd.
Xem thêm
- Mô-đun
faulthandler Được sử dụng để kết xuất các dấu vết Python một cách rõ ràng, khi có lỗi, sau khi hết thời gian chờ hoặc theo tín hiệu của người dùng.
- Mô-đun
traceback Giao diện chuẩn để trích xuất, định dạng và in dấu vết ngăn xếp của chương trình Python.
Cách sử dụng thông thường để đột nhập vào trình gỡ lỗi là chèn:
nhập pdb; pdb.set_trace()
Hoặc:
điểm dừng()
tại vị trí bạn muốn đột nhập vào trình gỡ lỗi, rồi chạy chương trình. Sau đó, bạn có thể duyệt qua mã theo câu lệnh này và tiếp tục chạy mà không cần trình gỡ lỗi bằng lệnh continue.
Thay đổi trong phiên bản 3.7: breakpoint() tích hợp, khi được gọi với giá trị mặc định, có thể được sử dụng thay vì import pdb; pdb.set_trace().
def gấp đôi (x):
điểm dừng()
trả về x * 2
giá trị = 3
print(f"{val} * 2 là {double(val)}")
Lời nhắc của trình gỡ lỗi là (Pdb), đây là dấu hiệu cho biết bạn đang ở chế độ gỡ lỗi:
> ...(2)gấp đôi()
-> điểm dừng()
(Pdb) p x
3
(Pdb) tiếp tục
3*2 là 6
Thay đổi trong phiên bản 3.3: Hoàn thành tab thông qua mô-đun readline có sẵn cho các lệnh và đối số lệnh, ví dụ: tên toàn cầu và tên cục bộ hiện tại được cung cấp dưới dạng đối số của lệnh p.
Giao diện dòng lệnh¶
Bạn cũng có thể gọi pdb từ dòng lệnh để gỡ lỗi các tập lệnh khác. Ví dụ:
python -m pdb [-c command] (-m module | -p pid | pyfile) [args ...]
Khi được gọi dưới dạng một mô-đun, pdb sẽ tự động chuyển sang chế độ gỡ lỗi sau khi xử lý nếu chương trình được gỡ lỗi thoát ra một cách bất thường. Sau khi gỡ lỗi sau khi chết (hoặc sau khi thoát khỏi chương trình bình thường), pdb sẽ khởi động lại chương trình. Tự động khởi động lại sẽ duy trì trạng thái của pdb (chẳng hạn như điểm dừng) và trong hầu hết các trường hợp, việc này hữu ích hơn việc thoát khỏi trình gỡ lỗi khi thoát khỏi chương trình.
- -c, --command <command>¶
Để thực thi các lệnh như thể được đưa ra trong tệp
.pdbrc; xem Lệnh gỡ lỗi.Thay đổi trong phiên bản 3.2: Đã thêm tùy chọn
-c.
- -m <module>¶
Để thực thi các mô-đun tương tự như cách
python -mthực hiện. Giống như tập lệnh, trình gỡ lỗi sẽ tạm dừng thực thi ngay trước dòng đầu tiên của mô-đun.Thay đổi trong phiên bản 3.7: Đã thêm tùy chọn
-m.
- -p, --pid <pid>¶
Đính kèm vào quy trình với PID được chỉ định.
Added in version 3.14.
Để đính kèm vào một quy trình Python đang chạy nhằm gỡ lỗi từ xa, hãy sử dụng tùy chọn -p hoặc --pid với PID:: của quy trình đích.
trăn -m pdb -p 1234
Ghi chú
Việc đính kèm vào một quy trình bị chặn trong lệnh gọi hệ thống hoặc chờ I/O sẽ chỉ hoạt động khi lệnh mã byte tiếp theo được thực thi hoặc khi quy trình nhận được tín hiệu.
Cách sử dụng điển hình để thực thi một câu lệnh dưới sự kiểm soát của trình gỡ lỗi là:
>>> nhập pdb
>>> định nghĩa f(x):
... in(1 / x)
>>> pdb.run("f(2)")
> <string>(1)<module>()
(Pdb) tiếp tục
0,5
>>>
Cách sử dụng thông thường để kiểm tra một chương trình bị lỗi là:
>>> nhập pdb
>>> định nghĩa f(x):
... in(1 / x)
...
>>>f(0)
Traceback (cuộc gọi gần đây nhất):
Tệp "<stdin>", dòng 1, trong <module>
Tệp "<stdin>", dòng 2, trong f
ZeroDivisionError: chia cho 0
>>> pdb.pm()
> <stdin>(2)f()
(Pdb) p x
0
(Pdb)
Thay đổi trong phiên bản 3.13: Việc triển khai PEP 667 có nghĩa là việc gán tên được thực hiện qua pdb sẽ ngay lập tức ảnh hưởng đến phạm vi hoạt động, ngay cả khi chạy bên trong optimized scope.
Mô-đun xác định các chức năng sau; mỗi cái vào trình gỡ lỗi theo một cách hơi khác:
- pdb.run(statement, globals=None, locals=None)¶
Thực thi statement (được cung cấp dưới dạng chuỗi hoặc đối tượng mã) dưới sự kiểm soát của trình gỡ lỗi. Lời nhắc của trình gỡ lỗi xuất hiện trước khi bất kỳ mã nào được thực thi; bạn có thể đặt điểm dừng và nhập
continuehoặc bạn có thể xem qua câu lệnh bằng cách sử dụngstephoặcnext(tất cả các lệnh này được giải thích bên dưới). Các đối số globals và locals tùy chọn chỉ định môi trường mà mã được thực thi; theo mặc định, từ điển của mô-đun__main__được sử dụng. (Xem phần giải thích về các hàmexec()hoặceval()tích hợp sẵn.)
- pdb.runeval(expression, globals=None, locals=None)¶
Đánh giá expression (được cung cấp dưới dạng chuỗi hoặc đối tượng mã) dưới sự kiểm soát của trình gỡ lỗi. Khi
runeval()trả về, nó trả về giá trị của expression. Nếu không thì chức năng này tương tự nhưrun().
- pdb.runcall(function, *args, **kwds)¶
Gọi function (một đối tượng hàm hoặc phương thức, không phải một chuỗi) với các đối số đã cho. Khi
runcall()trả về, nó sẽ trả về bất cứ thứ gì mà lệnh gọi hàm trả về. Lời nhắc của trình gỡ lỗi xuất hiện ngay khi chức năng được nhập.
- pdb.set_trace(*, header=None, commands=None)¶
Nhập trình gỡ lỗi vào khung ngăn xếp cuộc gọi. Điều này rất hữu ích để mã hóa cứng một điểm dừng tại một điểm nhất định trong chương trình, ngay cả khi mã không được gỡ lỗi (ví dụ: khi một xác nhận không thành công). Nếu được cung cấp, header sẽ được in ra bảng điều khiển ngay trước khi quá trình gỡ lỗi bắt đầu. Đối số commands, nếu được cung cấp, là danh sách các lệnh sẽ thực thi khi trình gỡ lỗi khởi động.
Thay đổi trong phiên bản 3.7: Đối số chỉ có từ khóa header.
Thay đổi trong phiên bản 3.13:
set_trace()sẽ vào trình gỡ lỗi ngay lập tức, thay vì vào dòng mã tiếp theo sẽ được thực thi.Added in version 3.14: Đối số commands.
- awaitable pdb.set_trace_async(*, header=None, commands=None)¶
phiên bản không đồng bộ của
set_trace(). Hàm này nên được sử dụng bên trong hàm không đồng bộ vớiawait.không đồng bộ def f(): đang chờ pdb.set_trace_async()
Các câu lệnh
awaitđược hỗ trợ nếu trình gỡ lỗi được gọi bởi hàm này.Added in version 3.14.
- pdb.post_mortem(t=None)¶
Nhập gỡ lỗi sau khi xử lý ngoại lệ đã cho hoặc traceback object. Nếu không có giá trị nào được đưa ra, nó sẽ sử dụng ngoại lệ hiện đang được xử lý hoặc tăng
ValueErrornếu không có.Thay đổi trong phiên bản 3.13: Hỗ trợ cho các đối tượng ngoại lệ đã được thêm vào.
- pdb.pm()¶
Nhập gỡ lỗi sau khi xử lý ngoại lệ được tìm thấy trong
sys.last_exc.
- pdb.set_default_backend(backend)¶
Có hai phần phụ trợ được hỗ trợ cho pdb:
'settrace'và'monitoring'. Xembdb.Bdbđể biết chi tiết. Người dùng có thể đặt phần phụ trợ mặc định để sử dụng nếu không có phần phụ trợ nào được chỉ định khi khởi tạoPdb. Nếu không có phần phụ trợ nào được chỉ định thì mặc định là'settrace'.Ghi chú
breakpoint()vàset_trace()sẽ không bị ảnh hưởng bởi chức năng này. Họ luôn sử dụng phụ trợ'monitoring'.Added in version 3.14.
- pdb.get_default_backend()¶
Trả về phần phụ trợ mặc định cho pdb.
Added in version 3.14.
Các hàm run* và set_trace() là bí danh để khởi tạo lớp Pdb và gọi phương thức cùng tên. Nếu bạn muốn truy cập các tính năng khác, bạn phải tự mình thực hiện việc này:
- class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True, mode=None, backend=None, colorize=False)¶
Pdblà lớp trình gỡ lỗi.Các đối số completekey, stdin và stdout được chuyển đến lớp
cmd.Cmdcơ bản; xem mô tả ở đó.Đối số skip, nếu được đưa ra, phải là một đối số có thể lặp lại của các mẫu tên mô-đun kiểu toàn cầu. Trình gỡ lỗi sẽ không bước vào các khung bắt nguồn từ mô-đun khớp với một trong các mẫu này. [1]
Theo mặc định, Pdb đặt trình xử lý cho tín hiệu SIGINT (được gửi khi người dùng nhấn Ctrl-C trên bảng điều khiển) khi bạn đưa ra lệnh
continue. Điều này cho phép bạn đột nhập lại vào trình gỡ lỗi bằng cách nhấn Ctrl-C. Nếu bạn muốn Pdb không chạm vào trình xử lý SIGINT, hãy đặt nosigint thành true.Đối số readrc mặc định là true và kiểm soát xem Pdb có tải tệp .pdbrc từ hệ thống tệp hay không.
Đối số mode chỉ định cách gọi trình gỡ lỗi. Nó tác động đến hoạt động của một số lệnh gỡ lỗi. Các giá trị hợp lệ là
'inline'(được sử dụng bởi nội dung breakpoint()),'cli'(được sử dụng bởi lệnh gọi dòng lệnh) hoặcNone(đối với hành vi tương thích ngược, như trước khi đối số mode được thêm vào).Đối số backend chỉ định phần phụ trợ sẽ sử dụng cho trình gỡ lỗi. Nếu
Noneđược thông qua, phần phụ trợ mặc định sẽ được sử dụng. Xemset_default_backend(). Nếu không thì các chương trình phụ trợ được hỗ trợ là'settrace'và'monitoring'.Đối số colorize, nếu được đặt thành
True, sẽ bật đầu ra được tô màu trong trình gỡ lỗi nếu màu được hỗ trợ. Điều này sẽ làm nổi bật mã nguồn được hiển thị trong pdb.Lệnh gọi ví dụ để bật theo dõi bằng skip:
nhập pdb; pdb.Pdb(skip=['django.*']).set_trace()
Tăng auditing event
pdb.Pdbmà không có đối số.Thay đổi trong phiên bản 3.1: Đã thêm tham số skip.
Thay đổi trong phiên bản 3.2: Đã thêm tham số nosigint. Trước đây, trình xử lý SIGINT chưa bao giờ được Pdb thiết lập.
Thay đổi trong phiên bản 3.6: Đối số readrc.
Added in version 3.14: Đã thêm đối số mode.
Added in version 3.14: Đã thêm đối số backend.
Added in version 3.14: Đã thêm đối số colorize.
Thay đổi trong phiên bản 3.14: Các điểm ngắt nội tuyến như
breakpoint()hoặcpdb.set_trace()sẽ luôn dừng chương trình ở khung đang gọi, bỏ qua mẫu skip (nếu có).
Lệnh gỡ lỗi¶
Các lệnh được trình gỡ lỗi nhận dạng được liệt kê bên dưới. Hầu hết các lệnh có thể được viết tắt thành một hoặc hai chữ cái như đã chỉ ra; ví dụ. h(elp) có nghĩa là có thể sử dụng h hoặc help để nhập lệnh trợ giúp (nhưng không phải he hoặc hel, cũng không phải H hoặc Help hoặc HELP). Các đối số của lệnh phải được phân tách bằng khoảng trắng (dấu cách hoặc tab). Các đối số tùy chọn được đặt trong dấu ngoặc vuông ([]) trong cú pháp lệnh; không được gõ dấu ngoặc vuông. Các lựa chọn thay thế trong cú pháp lệnh được phân tách bằng thanh dọc (|).
Nhập một dòng trống sẽ lặp lại lệnh cuối cùng đã nhập. Ngoại lệ: nếu lệnh cuối cùng là lệnh list thì 11 dòng tiếp theo sẽ được liệt kê.
Các lệnh mà trình gỡ lỗi không nhận ra được coi là các câu lệnh Python và được thực thi trong bối cảnh chương trình đang được gỡ lỗi. Các câu lệnh Python cũng có thể được bắt đầu bằng dấu chấm than (!). Đây là một cách mạnh mẽ để kiểm tra chương trình đang được gỡ lỗi; thậm chí có thể thay đổi một biến hoặc gọi một hàm. Khi một ngoại lệ xảy ra trong câu lệnh như vậy, tên ngoại lệ sẽ được in nhưng trạng thái của trình gỡ lỗi không thay đổi.
Thay đổi trong phiên bản 3.13: Các biểu thức/câu lệnh có tiền tố là lệnh pdb hiện đã được xác định và thực thi chính xác.
Trình gỡ lỗi hỗ trợ aliases. Bí danh có thể có các tham số cho phép một mức độ thích ứng nhất định với bối cảnh đang được kiểm tra.
Nhiều lệnh có thể được nhập trên một dòng, cách nhau bằng ;;. (Một ; không được sử dụng vì nó là dấu phân cách cho nhiều lệnh trong một dòng được chuyển tới trình phân tích cú pháp Python.) Không có thông tin nào được áp dụng để phân tách các lệnh; đầu vào được phân chia ở cặp ;; đầu tiên, ngay cả khi nó nằm ở giữa chuỗi được trích dẫn. Một cách giải quyết khác cho các chuỗi có dấu chấm phẩy kép là sử dụng phép nối chuỗi ẩn ';'';' hoặc ";"";".
Để đặt biến toàn cục tạm thời, hãy sử dụng convenience variable. Zz005zz là một biến có tên bắt đầu bằng $. Ví dụ: $foo = 1 đặt biến toàn cục $foo mà bạn có thể sử dụng trong phiên gỡ lỗi. convenience variables sẽ bị xóa khi chương trình tiếp tục thực thi nên nó ít có khả năng can thiệp vào chương trình của bạn hơn so với việc sử dụng các biến thông thường như foo = 1.
Có bốn convenience variables cài sẵn:
$_frame: khung hình hiện tại bạn đang gỡ lỗi$_retval: giá trị trả về nếu khung quay trở lại$_exception: ngoại lệ nếu khung đang đưa ra ngoại lệ$_asynctask: tác vụ asyncio nếu pdb dừng ở chức năng không đồng bộ
Added in version 3.12: Đã thêm tính năng convenience variable.
Added in version 3.14: Đã thêm biến tiện lợi $_asynctask.
Nếu một 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ó sẽ được đọc bằng mã hóa 'utf-8' và được thực thi như thể nó đã được gõ tại dấu nhắc của trình gỡ lỗi, ngoại trừ các dòng trống và các dòng bắt đầu bằng # sẽ bị bỏ qua. Điều này đặc biệt hữu ích cho các 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 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ư continue hoặc next. Trước đây, các lệnh này không có hiệu lực.
Thay đổi trong phiên bản 3.11: .pdbrc hiện được đọc bằng mã hóa 'utf-8'. Trước đây, nó được đọc bằng mã hóa ngôn ngữ hệ thống.
- h(elp) [command]¶
Không có đối số, hãy in danh sách các lệnh có sẵn. Với đối số là command, hãy in phần trợ giúp về lệnh đó.
help pdbhiển thị tài liệu đầy đủ (chuỗi tài liệu của mô-đunpdb). Vì đối số command phải là một mã định danh nên phải nhậphelp execđể nhận trợ giúp về lệnh!.
- w(here) [count]¶
In dấu vết ngăn xếp, với khung gần đây nhất ở dưới cùng. nếu count bằng 0, hãy in mục nhập khung hiện tại. Nếu count âm, hãy in các khung gần đây nhất - count. Nếu count dương, hãy in các khung count gần đây nhất. Mũi tên (
>) biểu thị khung hiện tại, xác định ngữ cảnh của hầu hết các lệnh.Thay đổi trong phiên bản 3.14: đối số count được thêm vào.
- d(own) [count]¶
Di chuyển mức count của khung hiện tại (mặc định) xuống trong dấu vết ngăn xếp (sang khung mới hơn).
- u(p) [count]¶
Di chuyển khung hình hiện tại count (mặc định) lên cấp trong dấu vết ngăn xếp (sang khung cũ hơn).
- b(reak) [([filename:]lineno | function) [, condition]]¶
Với đối số lineno, đặt dấu ngắt ở dòng lineno trong tệp hiện tại. Số dòng có thể có tiền tố là filename và dấu hai chấm, để chỉ định điểm dừng trong một tệp khác (có thể là điểm dừng chưa được tải). Tệp được tìm kiếm trên
sys.path. Các dạng filename được chấp nhận là/abspath/to/file.py,relpath/file.py,modulevàpackage.module.Với đối số function, đặt dấu ngắt ở câu lệnh thực thi đầu tiên trong hàm đó. function có thể là bất kỳ biểu thức nào đánh giá một hàm trong không gian tên hiện tại.
Nếu có đối số thứ hai thì đó là biểu thức phải đánh giá là đúng trước khi điểm ngắt được thực hiện.
Không có đối số, hãy liệt kê tất cả các điểm ngắt, bao gồm từng điểm ngắt, số lần điểm ngắt đó đã được chạm, số lần bỏ qua hiện tại và điều kiện liên quan nếu có.
Mỗi điểm dừng được gán một số mà tất cả các lệnh điểm dừng khác tham chiếu đến.
- tbreak [([filename:]lineno | function) [, condition]]¶
Điểm dừng tạm thời, điểm này sẽ tự động bị xóa khi chạm lần đầu. Các đối số giống như đối với
break.
- cl(ear) [filename:lineno | bpnumber ...]¶
Với đối số filename:lineno, hãy xóa tất cả các điểm dừng ở dòng này. Với danh sách các số điểm dừng được phân tách bằng dấu cách, hãy xóa các điểm dừng đó. Không cần tranh luận, hãy xóa tất cả các dấu ngắt (nhưng trước tiên hãy hỏi xác nhận).
- disable bpnumber [bpnumber ...]¶
Vô hiệu hóa các điểm dừng được cung cấp dưới dạng danh sách các số điểm dừng được phân tách bằng dấu cách. Vô hiệu hóa điểm dừng có nghĩa là nó không thể khiến chương trình ngừng thực thi, nhưng không giống như xóa điểm dừng, nó vẫn nằm trong danh sách các điểm dừng và có thể được bật (bật lại).
- enable bpnumber [bpnumber ...]¶
Kích hoạt các điểm dừng được chỉ định.
- ignore bpnumber [count]¶
Đặt số lượng bỏ qua cho số điểm dừng đã cho. Nếu count bị bỏ qua, số lần bỏ qua được đặt thành 0. Điểm dừng sẽ hoạt động khi số lần bỏ qua bằng 0. Khi khác 0, count sẽ giảm đi mỗi khi đạt đến điểm dừng và điểm dừng không bị vô hiệu hóa cũng như mọi điều kiện liên quan đều được đánh giá là đúng.
- condition bpnumber [condition]¶
Đặt condition mới cho điểm ngắt, một biểu thức phải đánh giá là đúng trước khi điểm ngắt được thực hiện. Nếu condition vắng mặt, mọi điều kiện hiện có sẽ bị xóa; tức là điểm dừng được thực hiện vô điều kiện.
- commands [bpnumber]¶
Chỉ định danh sách các lệnh cho số điểm dừng bpnumber. Bản thân các lệnh xuất hiện trên các dòng sau. Nhập một dòng chỉ chứa
endđể kết thúc lệnh. Một ví dụ:(Pdb) lệnh 1 (com) p some_variable (com) kết thúc (Pdb)
Để xóa tất cả các lệnh khỏi điểm dừng, hãy nhập
commandsvà làm theo ngay lập tức bằngend; nghĩa là không đưa ra mệnh lệnh nào.Không có đối số bpnumber,
commandsđề cập đến tập hợp điểm dừng cuối cùng.Bạn có thể sử dụng lệnh điểm dừng để khởi động lại chương trình của mình. Chỉ cần sử dụng lệnh
continuehoặcstephoặc bất kỳ lệnh nào khác để tiếp tục thực thi.Việc chỉ định bất kỳ lệnh nào tiếp tục thực thi (hiện tại là
continue,step,next,return,until,jump,quitvà các chữ viết tắt của chúng) sẽ chấm dứt danh sách lệnh (như thể lệnh đó được theo sau bởi end). Điều này là do bất cứ khi nào bạn tiếp tục thực thi (ngay cả với bước tiếp theo hoặc bước đơn giản), bạn có thể gặp phải một điểm dừng khác—điểm dừng này có thể có danh sách lệnh riêng, dẫn đến sự mơ hồ về danh sách nào sẽ thực thi.Nếu danh sách lệnh chứa lệnh
silenthoặc lệnh tiếp tục thực thi thì thông báo điểm dừng chứa thông tin về khung sẽ không được hiển thị.Thay đổi trong phiên bản 3.14: Thông tin khung sẽ không được hiển thị nếu lệnh tiếp tục thực hiện có trong danh sách lệnh.
- s(tep)¶
Thực thi dòng hiện tại, dừng lại ở trường hợp đầu tiên có thể (trong hàm được gọi hoặc ở dòng tiếp theo trong hàm hiện tại).
- n(ext)¶
Tiếp tục thực hiện cho đến khi đạt đến dòng tiếp theo trong hàm hiện tại hoặc nó trả về. (Sự khác biệt giữa
nextvàsteplàstepdừng bên trong hàm được gọi, trong khinextthực thi các hàm được gọi ở tốc độ (gần) tối đa, chỉ dừng ở dòng tiếp theo trong hàm hiện tại.)
- unt(il) [lineno]¶
Không có đối số, tiếp tục thực thi cho đến khi đạt đến dòng có số lớn hơn số hiện tại.
Với lineno, tiếp tục thực hiện cho đến khi đạt đến dòng có số lớn hơn hoặc bằng lineno. Trong cả hai trường hợp, cũng dừng khi khung hiện tại quay trở lại.
Thay đổi trong phiên bản 3.2: Cho phép đưa ra số dòng rõ ràng.
- r(eturn)¶
Tiếp tục thực hiện cho đến khi hàm hiện tại trả về.
- c(ont(inue))¶
Tiếp tục thực hiện, chỉ dừng khi gặp điểm ngắt.
- j(ump) lineno¶
Đặt dòng tiếp theo sẽ được thực thi. Chỉ có ở khung dưới cùng. Điều này cho phép bạn quay lại và thực thi lại mã hoặc nhảy về phía trước để bỏ qua mã mà bạn không muốn chạy.
Cần lưu ý rằng không phải tất cả các bước nhảy đều được phép -- ví dụ: không thể nhảy vào giữa vòng lặp
forhoặc ra khỏi mệnh đềfinally.
- l(ist) [first[, last]]¶
Liệt kê mã nguồn của tập tin hiện tại. Không có đối số, hãy liệt kê 11 dòng xung quanh dòng hiện tại hoặc tiếp tục danh sách trước đó. Với
.làm đối số, liệt kê 11 dòng xung quanh dòng hiện tại. Với một đối số, hãy liệt kê 11 dòng xung quanh dòng đó. Với hai đối số, hãy liệt kê phạm vi đã cho; nếu đối số thứ hai nhỏ hơn đối số thứ nhất thì nó được hiểu là số đếm.Dòng hiện tại trong khung hiện tại được biểu thị bằng
->. Nếu một ngoại lệ đang được gỡ lỗi, dòng nơi ngoại lệ ban đầu được đưa ra hoặc truyền bá sẽ được biểu thị bằng>>, nếu nó khác với dòng hiện tại.Thay đổi trong phiên bản 3.2: Đã thêm điểm đánh dấu
>>.
- ll | longlist¶
Liệt kê tất cả mã nguồn của hàm hoặc khung hiện tại. Các dòng thú vị được đánh dấu là dành cho
list.Added in version 3.2.
- a(rgs)¶
In các đối số của hàm hiện tại và các giá trị hiện tại của chúng.
- p expression¶
Đánh giá expression trong bối cảnh hiện tại và in giá trị của nó.
Ghi chú
print()cũng có thể được sử dụng, nhưng không phải là lệnh gỡ lỗi --- lệnh này thực thi hàmprint()của Python.
- whatis expression¶
In kiểu expression.
- source expression¶
Hãy thử lấy mã nguồn của expression và hiển thị nó.
Added in version 3.2.
- display [expression]¶
Hiển thị giá trị của expression nếu nó thay đổi, mỗi lần dừng thực thi ở khung hiện tại.
Không có expression, liệt kê tất cả các biểu thức hiển thị cho khung hiện tại.
Ghi chú
Display đánh giá expression và so sánh với kết quả đánh giá expression trước đó, vì vậy, khi kết quả có thể thay đổi, màn hình có thể không nhận được các thay đổi.
Ví dụ:
lst = [] điểm dừng() vượt qua lst.append(1) in(lst)
Màn hình sẽ không nhận ra
lstđã bị thay đổi do kết quả đánh giá đã đượclst.append(1)sửa đổi tại chỗ trước khi được so sánh:> example.py(3)<module>() -> vượt qua (Pdb) hiển thị lst hiển thị lst: [] (Pdb) n > example.py(4)<module>() -> lst.append(1) (Pdb) n > example.py(5)<module>() -> in(lst) (Pdb)
Bạn có thể thực hiện một số thủ thuật với cơ chế sao chép để làm cho nó hoạt động
> example.py(3)<module>() -> vượt qua (Pdb) hiển thị lst[:] hiển thị lst[:]: [] (Pdb) n > example.py(4)<module>() -> lst.append(1) (Pdb) n > example.py(5)<module>() -> in(lst) hiển thị lst[:]: [1] [cũ: []] (Pdb)
Added in version 3.2.
- undisplay [expression]¶
Không hiển thị expression nữa trong khung hiện tại. Nếu không có expression, hãy xóa tất cả biểu thức hiển thị cho khung hiện tại.
Added in version 3.2.
- interact¶
Khởi động trình thông dịch tương tác (sử dụng mô-đun
code) trong một không gian tên chung mới được khởi tạo từ các không gian tên cục bộ và chung cho phạm vi hiện tại. Sử dụngexit()hoặcquit()để thoát trình thông dịch và quay lại trình gỡ lỗi.Ghi chú
Vì
interacttạo một không gian tên chuyên dụng mới để thực thi mã nên việc gán cho các biến sẽ không ảnh hưởng đến không gian tên ban đầu. Tuy nhiên, những sửa đổi đối với bất kỳ đối tượng có thể thay đổi được tham chiếu nào sẽ được phản ánh trong không gian tên ban đầu như thường lệ.Added in version 3.2.
Thay đổi trong phiên bản 3.13:
exit()vàquit()có thể được sử dụng để thoát lệnhinteract.Thay đổi trong phiên bản 3.13:
interacthướng đầu ra của nó tới kênh đầu ra của trình gỡ lỗi thay vìsys.stderr.
- alias [name [command]]¶
Tạo bí danh có tên name để thực thi command. command phải được đặt trong dấu ngoặc kép not. Các tham số có thể thay thế có thể được biểu thị bằng
%1,%2, ... và%9, trong khi%*được thay thế bằng tất cả các tham số. Nếu command bị bỏ qua, bí danh hiện tại của name sẽ được hiển thị. Nếu không có đối số nào được đưa ra thì tất cả các bí danh sẽ được liệt kê.Các bí danh có thể được lồng vào nhau và có thể chứa bất kỳ thứ gì có thể được nhập hợp pháp tại dấu nhắc pdb. Lưu ý rằng các lệnh pdb nội bộ can sẽ bị ghi đè bằng bí danh. Lệnh như vậy sau đó sẽ bị ẩn cho đến khi bí danh bị xóa. Bí danh được áp dụng đệ quy cho từ đầu tiên của dòng lệnh; tất cả các từ khác trong dòng được để yên.
Ví dụ: đây là hai bí danh hữu ích (đặc biệt khi được đặt trong tệp
.pdbrc):Các biến thể hiện của # Print (cách sử dụng "pi classInst") bí danh pi cho k trong %1.__dict__.keys(): print(f"%1.{k} = {%1.__dict__[k]}") Các biến thể hiện # Print trong bản thân bí danh ps pi tự
- unalias name¶
Xóa bí danh được chỉ định name.
- ! statement¶
Thực thi statement (một dòng) trong ngữ cảnh của khung ngăn xếp hiện tại. Dấu chấm than có thể được bỏ qua trừ khi từ đầu tiên của câu lệnh giống với lệnh gỡ lỗi, ví dụ:
(Pdb) ! n=42 (Pdb)
Để đặt biến toàn cục, bạn có thể đặt trước lệnh gán một câu lệnh
globaltrên cùng một dòng, ví dụ:(Pdb) danh sách toàn cầu_options; list_options = ['-l'] (Pdb)
- run [args ...]¶
- restart [args ...]¶
Khởi động lại chương trình Python đã được gỡ lỗi. Nếu args được cung cấp, nó sẽ được chia thành
shlexvà kết quả được sử dụng làmsys.argvmới. Lịch sử, điểm dừng, hành động và tùy chọn trình gỡ lỗi được giữ nguyên.restartlà bí danh củarun.
- q(uit)¶
Thoát khỏi trình gỡ lỗi. Chương trình đang thực hiện bị hủy bỏ. Đầu vào ở cuối tệp tương đương với
quit.Lời nhắc xác nhận sẽ được hiển thị nếu trình gỡ lỗi được gọi ở chế độ
'inline'.y,Y,<Enter>hoặcEOFsẽ xác nhận việc thoát.Thay đổi trong phiên bản 3.14: Lời nhắc xác nhận sẽ được hiển thị nếu trình gỡ lỗi được gọi ở chế độ
'inline'. Sau khi xác nhận, trình gỡ lỗi sẽ gọisys.exit()ngay lập tức, thay vì tăngbdb.BdbQuittrong sự kiện theo dõi tiếp theo.
- debug code¶
Nhập trình gỡ lỗi đệ quy đi qua code (là một biểu thức hoặc câu lệnh tùy ý sẽ được thực thi trong môi trường hiện tại).
- retval¶
In giá trị trả về cho lần trả về cuối cùng của hàm hiện tại.
- exceptions [excnumber]¶
Liệt kê hoặc nhảy giữa các ngoại lệ theo chuỗi.
Khi sử dụng
pdb.pm()hoặcPdb.post_mortem(...)với ngoại lệ được xâu chuỗi thay vì truy nguyên, nó cho phép người dùng di chuyển giữa các ngoại lệ được xâu chuỗi bằng cách sử dụng lệnhexceptionsđể liệt kê các ngoại lệ vàexceptions <number>để chuyển sang ngoại lệ đó.Ví dụ:
chắc chắn ra(): thử: giữa() ngoại trừ Ngoại lệ là e: raise ValueError("reraise middle() error") từ e def giữa(): thử: trở về bên trong(0) ngoại trừ Ngoại lệ là e: tăng ValueError("Thất bại ở giữa") def bên trong (x): 1 / x ra()
gọi
pdb.pm()sẽ cho phép di chuyển giữa các ngoại lệ> example.py(5)out() -> tăng ValueError("reraise middle() error") từ e (Pdb) ngoại lệ 0 ZeroDivisionError('chia cho số 0') 1 ValueError('Thất bại ở giữa') > 2 ValueError('reraise middle() error') (Pdb) ngoại lệ 0 > example.py(16)inner() -> 1/x (Pdb) lên > example.py(10)middle() -> trả về bên trong (0)
Added in version 3.13.
Chú thích cuối trang