Trong thuật ngữ phát triển phần mềm, thuật ngữ 'gỡ lỗi' được sử dụng phổ biến để xử lý việc xác định vị trí và sửa lỗi trong một chương trình. Thư viện tiêu chuẩn của Python chứa mô-đun pdb là một tập hợp các tiện ích để gỡ lỗi các chương trình Python.
Chức năng gỡ lỗi được định nghĩa trong một lớp Pdb. Mô-đun nội bộ sử dụng mô-đun bdb và cmd.
Mô-đun pdb có giao diện dòng lệnh rất thuận tiện. Nó được nhập tại thời điểm thực thi tập lệnh Python bằng cách sử dụng công tắc –m
python –m pdb script.py
Để tìm hiểu thêm về cách hoạt động của trình gỡ lỗi, trước tiên chúng ta hãy viết một mô-đun Python (fact.py) như sau -
def fact(x): f = 1 for i in range(1,x+1): print (i) f = f * i return f if __name__=="__main__": print ("factorial of 3=",fact(3))
Bắt đầu gỡ lỗi mô-đun này từ dòng lệnh. Trong trường hợp này, việc thực thi tạm dừng ở dòng đầu tiên trong mã bằng cách hiển thị mũi tên (->) ở bên trái và tạo ra lời nhắc trình gỡ lỗi (Pdb)
C:\python36>python -m pdb fact.py > c:\python36\fact.py(1)<module>() -> def fact(x): (Pdb)
Để xem danh sách tất cả các lệnh trình gỡ lỗi, hãy nhập 'trợ giúp' trước lời nhắc trình gỡ lỗi. Để biết thêm về bất kỳ lệnh nào, hãy sử dụng cú pháp 'help
Lệnh list liệt kê toàn bộ mã với -> ký hiệu ở bên trái của dòng mà tại đó chương trình đã tạm dừng.
(Pdb) list 1 -> def fact(x): 2 f = 1 3 for i in range(1,x+1): 4 print (i) 5 f = f * i 6 return f 7 if __name__=="__main__": 8 print ("factorial of 3 = ", fact(3))
Để di chuyển qua từng dòng chương trình, hãy sử dụng bước hoặc lệnh tiếp theo.
(Pdb) step > c:\python36\fact.py(7)<module>() -> if __name__=="__main__": (Pdb) next > c:\python36\fact.py(8)<module>() -> print ("factorial of 3 = ", fact(3)) (Pdb) next 1 2 3 factorial of 3= 6 --Return-- > c:\python36\fact.py(8)<module>()->None -> print ("factorial of 3 = ", fact(3))
Sự khác biệt chính giữa bước và lệnh tiếp theo là lệnh bước sẽ khiến chương trình dừng lại trong một hàm trong khi lệnh tiếp theo thực hiện một hàm được gọi và dừng sau nó.
C:\python36>python -m pdb fact.py > c:\python36\fact.py(1)<module>() -> def fact(x): (Pdb) s > c:\python36\fact.py(7)<module>() -> if __name__=="__main__": (Pdb) n > c:\python36\fact.py(8)<module>() -> print ("factorial of 3=",fact(3)) (Pdb) s --Call-- > c:\python36\fact.py(1)fact() -> def fact(x): (Pdb) n > c:\python36\fact.py(2)fact() -> f = 1 (Pdb) n > c:\python36\fact.py(3)fact() -> for i in range(1,x+1): (Pdb) n > c:\python36\fact.py(4)fact() -> print (i) (Pdb) n 1 > c:\python36\fact.py(5)fact() -> f = f * i (Pdb) n > c:\python36\fact.py(3)fact() -> for i in range(1, x + 1): (Pdb) n > c:\python36\fact.py(4)fact() -> print (i) (Pdb) f,i (1, 2) (Pdb)
Lệnh bước cũng hiển thị --call — chỉ báo khi chương trình gặp một lệnh gọi hàm và - trở lại --- khi một chức năng kết thúc. Tại bất kỳ thời điểm nào, chúng tôi có thể kiểm tra giá trị của một biến nhất định bằng cách chỉ cần nhập tên của nó.
Bạn có thể đặt các điểm ngắt trong chương trình bằng lệnh break. Số dòng (tại điểm ngắt sẽ được đặt) phải được cung cấp. Ví dụ:'break 5' sẽ đặt một breakpoint ở dòng 5 của chương trình hiện tại.
(Pdb) list 2 f = 1 3 for i in range(1, x + 1): 4 print (i) 5 f = f * i 6 return f 7 -> if __name__=="__main__": 8 print ("factorial of 3=",fact(3)) [EOF] (Pdb) break 5 Breakpoint 1 at c:\python36\fact.py:5 (Pdb) continue 1 > c:\python36\fact.py(5)fact() -> f = f * i (Pdb) break Num Type Disp Enb Where 1 breakpoint keep yes at c:\python36\fact.py:5 breakpoint already hit 1 time (Pdb) continue 2 > c:\python36\fact.py(5)fact() -> f = f * i (Pdb) b Num Type Disp Enb Where 1 breakpoint keep yes at c:\python36\fact.py:5 breakpoint already hit 2 times
Khi lệnh 'tiếp tục' được đưa ra, việc thực thi chương trình sẽ tiếp tục cho đến khi nó gặp một điểm ngắt. Để hiển thị tất cả các điểm ngắt, hãy sử dụng lệnh ngắt đơn giản mà không có số dòng.
Bất kỳ điểm ngắt nào cũng có thể bị vô hiệu hóa / bật bằng lệnh tắt / bật hoặc xóa hoàn toàn bằng lệnh xóa.
(Pdb) disable 1 Disabled breakpoint 1 at c:\python36\fact.py:5 (Pdb) b Num Type Disp Enb Where 1 breakpoint keep no at c:\python36\fact.py:5 breakpoint already hit 2 times
Trình gỡ lỗi Pdb cũng có thể được sử dụng từ bên trong tập lệnh Python. Để làm như vậy, hãy nhập pdb ở đầu tập lệnh và sử dụng phương thức set_trace () bên trong chương trình.
import pdb def fact(x): f = 1 for i in range(1,x+1): pdb.set_trace() print (i) f = f * i return f if __name__=="__main__": print ("factorial of 3=",fact(3))
Hoạt động của trình gỡ lỗi sẽ giống hệt như chúng ta tìm thấy nó trong môi trường dòng lệnh.