Làm thế nào để bước qua mã Python để giúp gỡ lỗi?


183

Trong Java / C #, bạn có thể dễ dàng chuyển qua mã để theo dõi những gì có thể xảy ra và IDE làm cho quy trình này trở nên thân thiện với người dùng.

Bạn có thể theo dõi thông qua mã python theo cách tương tự?

Câu trả lời:


261

Đúng! Có một trình gỡ lỗi Python được gọi pdbchỉ để làm điều đó!

Bạn có thể khởi chạy chương trình Python thông qua pdbbằng cách sử dụng pdb myscript.pyhoặc python -m pdb myscript.py.

Có một số lệnh sau đó bạn có thể ban hành, được ghi lại trên pdbtrang.

Một số điều hữu ích cần nhớ là:

  • b: đặt điểm dừng
  • c: tiếp tục gỡ lỗi cho đến khi bạn đạt điểm dừng
  • s: bước qua mã
  • n: để đi đến dòng mã tiếp theo
  • l: liệt kê mã nguồn cho tệp hiện tại (mặc định: 11 dòng bao gồm cả dòng đang được thực thi)
  • u: điều hướng lên khung stack
  • d: điều hướng xuống khung stack
  • p: để in giá trị của biểu thức trong ngữ cảnh hiện tại

Nếu bạn không muốn sử dụng trình gỡ lỗi dòng lệnh, một số IDE như Pydev , Wing IDE hoặc PyCharm có trình gỡ lỗi GUI. Wing và PyCharm là các sản phẩm thương mại, nhưng Wing có phiên bản "Cá nhân" miễn phí và PyCharm có phiên bản cộng đồng miễn phí.


10
Ồ, tôi không thể tin rằng tôi đang gặp khó khăn khi tìm một pdb đồ họa cho linux / ubfox. Tui bỏ lỡ điều gì vậy? Tôi có thể phải xem xét việc tạo một SublimeText Plugin cho nó.
ThorSummoner

4
PyCharm là một trình gỡ lỗi đồ họa khá tốt và Community Edition của nó là miễn phí!
Pieter

@ThorSummoner, pudbthật tuyệt vời cho điều đó. Ngoài rapydev
alpha_989

pdbkhông phải là một công cụ dòng lệnh. Để sử dụng nó, sử dụng python -m pdb your_script.py.
jdhao

55

Bằng cách sử dụng Trình gỡ lỗi tương tác Python 'pdb'

Bước đầu tiên là làm cho trình thông dịch Python chuyển sang chế độ gỡ lỗi.

A. Từ dòng lệnh

Cách thẳng nhất, chạy từ dòng lệnh, của trình thông dịch python

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B. Trong phiên dịch

Trong khi phát triển các phiên bản đầu tiên của các mô-đun và để thử nghiệm nó lặp đi lặp lại nhiều hơn.

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C. Từ trong chương trình của bạn

Đối với một dự án lớn và mô-đun chạy dài, có thể bắt đầu gỡ lỗi từ bên trong chương trình bằng cách nhập pdbset_trace () như thế này:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

Từng bước gỡ lỗi để đi sâu vào nội bộ hơn

  1. Thực hiện câu lệnh tiếp theo, với trò chơi nv (tiếp theo)

  2. Lặp lại lệnh gỡ lỗi cuối cùng với ENTER

  3. Bỏ tất cả ... với “q” (bỏ)

  4. In giá trị của biến số với P khắc (in)

    a) pa

  5. Tắt lời nhắc (Pdb) với “c” (tiếp tục)

  6. Thấy bạn đang ở đâu ... với “l” (danh sách)

  7. Bước vào chương trình con ... với “s” (bước vào)

  8. Tiếp tục, nhưng đến cuối chương trình con hiện tại, với R r thì (trở lại)

  9. Gán một giá trị mới

    a) ! b = "B"

  10. Đặt điểm dừng

    a) phá vỡ vải lanh

    b) phá vỡ tên hàm

    c) phá vỡ tên tệp: vải lanh

  11. Điểm dừng tạm thời

    a) vải lanh

  12. Điểm dừng có điều kiện

    a) phá vỡ vải lanh, điều kiện

Lưu ý: ** Tất cả các lệnh này phải được thực thi từ ** pdb

Để có kiến ​​thức chuyên sâu, hãy tham khảo: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/


41

Có một mô-đun gọi là 'pdb' trong python. Ở đầu tập lệnh python của bạn, bạn làm

import pdb
pdb.set_trace()

và bạn sẽ vào chế độ gỡ lỗi. Bạn có thể sử dụng 's' để bước, 'n' để theo dõi dòng tiếp theo tương tự như những gì bạn sẽ làm với trình gỡ lỗi 'gdb'.


21

Bắt đầu trong Python 3.7, bạn có thể sử dụng hàm breakpoint()dựng sẵn để vào trình gỡ lỗi:

foo()
breakpoint()  # drop into the debugger at this point
bar()

Theo mặc định, breakpoint()sẽ nhập pdbvà gọi pdb.set_trace(). Tuy nhiên, bạn có thể kiểm soát hành vi gỡ lỗi thông qua sys.breakpointhook()và sử dụng biến môi trườngPYTHONBREAKPOINT .

Xem PEP 553 để biết thêm thông tin.


2
Khi nhìn thấy breakpointtôi rất phấn khích. Nhưng sau đó tôi đã học được rằng về cơ bản nó chỉ là một lối tắt import pdb; pdb.set_trace()và điều đó làm tôi buồn. Các nhà phát triển Python: vui lòng tập trung vào việc cải thiện PDB với các tính năng GDB cơ bản như dòng ngữ cảnh, lịch sử lệnh liên tục và tự động hoàn thành tab :-)
Ciro Santilli 郝海东 冠状

10

ipdb (trình gỡ lỗi IPython)

ipdb thêm chức năng IPython vào pdb, cung cấp các cải tiến HUGE sau:

  • hoàn thành tab
  • hiển thị nhiều dòng ngữ cảnh
  • cú pháp tô sáng

Giống như pdg, ipdb vẫn chưa hoàn hảo và hoàn toàn thô sơ nếu so với GDB, nhưng nó đã là một cải tiến rất lớn so với pdb.

Cách sử dụng tương tự pdb, chỉ cần cài đặt nó với:

python3 -m pip install --user ipdb

và sau đó thêm vào dòng bạn muốn gỡ lỗi từ:

__import__('ipdb').set_trace(context=21)

Bạn có thể muốn thêm một lối tắt cho điều đó từ trình chỉnh sửa của mình, ví dụ như đối với người bắn tỉa Vim tôi có:

snippet ipd
    __import__('ipdb').set_trace(context=21)

vì vậy tôi có thể gõ chỉ ipd<tab>và nó mở rộng đến điểm dừng. Sau đó loại bỏ nó là dễ dàng ddvì mọi thứ được chứa trong một dòng duy nhất.

context=21tăng số lượng dòng ngữ cảnh như được giải thích tại: Làm cách nào để ipdb hiển thị nhiều dòng ngữ cảnh hơn trong khi gỡ lỗi?

Ngoài ra, bạn cũng có thể gỡ lỗi chương trình từ đầu bằng:

ipdb3 main.py

nhưng bạn thường không muốn làm điều đó bởi vì:

  • bạn sẽ phải trải qua tất cả các định nghĩa hàm và lớp khi Python đọc các dòng đó
  • Tôi không biết cách đặt kích thước ngữ cảnh ở đó mà không cần hack ipdb. Bản vá để cho phép nó: https://github.com/gotcha/ipdb/pull/155

Hoặc cách khác, như trong pdb thô 3.2+, bạn có thể đặt một số điểm dừng từ dòng lệnh:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

mặc dù -c cbị hỏng vì một số lý do: https://github.com/gotcha/ipdb/issues/156

python -m modulegỡ lỗi đã được hỏi tại: Làm thế nào để gỡ lỗi một mô-đun Python chạy với python -m từ dòng lệnh? và vì Python 3.7 có thể được thực hiện với:

python -m pdb -m my_module

Các tính năng thiếu nghiêm trọng của cả pdb và ipdb so với GDB:

Những phiền toái cụ thể của ipdb:

Đã thử nghiệm trong Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.



3

Nếu bạn đến từ nền Java / C #, tôi đoán rằng cách tốt nhất của bạn là sử dụng Eclipse với Pydev . Điều này cung cấp cho bạn một IDE đầy đủ chức năng với trình gỡ lỗi được tích hợp. Tôi cũng sử dụng nó với django.




2

Python Tutor là một trình gỡ lỗi một bước trực tuyến dành cho người mới. Bạn có thể đặt mã trên trang chỉnh sửa sau đó nhấp vào "Trực quan hóa thực thi" để bắt đầu chạy.

Trong số những thứ khác, nó hỗ trợ:

Tuy nhiên, nó cũng không hỗ trợ nhiều thứ , ví dụ:

  • Đọc / ghi tệp - sử dụng io.StringIOio.BytesIOthay vào đó: demo
  • Mã quá lớn, chạy quá lâu hoặc định nghĩa quá nhiều biến hoặc đối tượng
  • Đối số dòng lệnh
  • Rất nhiều mô-đun thư viện tiêu chuẩn như argparse, csv, enum, html, os, struct, yếu ...

1

Có thể lập trình bước và truy tìm thông qua mã python (và thật dễ dàng!). Nhìn vào tài liệu sys.settrace () để biết thêm chi tiết. Ngoài ra đây là một hướng dẫn để giúp bạn bắt đầu.



1

PyCharm là một IDE cho Python bao gồm trình gỡ lỗi. Xem video YouTube này để biết giới thiệu về cách sử dụng trình gỡ lỗi của PyCharm để thực hiện mã.

Hướng dẫn PyCharm - Gỡ lỗi mã python bằng PyCharm

Lưu ý: Đây không phải là một sự chứng thực hoặc đánh giá. PyCharm là một sản phẩm thương mại mà người ta cần phải trả tiền, nhưng công ty cung cấp giấy phép miễn phí cho sinh viên và giáo viên, cũng như một phiên bản Cộng đồng "nhẹ" miễn phí và là nguồn mở.

Ảnh chụp màn hình

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.