Trong thuật ngữ phát triển phần mềm, thuật ngữ "gỡ lỗi" (debugging) thường được dùng để chỉ quá trình định vị và sửa chữa lỗi trong chương trình. Thư viện chuẩn của Python chứa mô-đun pdb là một tập hợp tiện ích để gỡ lỗi chương trình Python.
Chức năng gỡ lỗi được định nghĩa trong lớp Pdb. Mô-đun nội bộ sử dụng các mô-đun bdb và cmd.
Mô-đun pdb có một giao diện dòng lệnh rất tiện lợi. Nó được nhập tại thời điểm thực thi script Python bằng cách dùng chuyển đổi -m:
python -m pdb script.py
Để tìm hiểu thêm về cách bộ gỡ lỗi hoạt động, hãy viết trước 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, thực thi dừng lại ở dòng đầu tiên trong mã bằng cách hiển thị mũi tên (->) bên trái nó, và tạo ra dấu nhắc bộ 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ả lệnh gỡ lỗi, gõ help trước dấu nhắc bộ gỡ lỗi. Để biết thêm về bất kỳ lệnh nào, dùng cú pháp help <command>.

Lệnh list liệt kê toàn bộ mã với ký hiệu -> bên trái dòng mà chương trình đã 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 chương trình dòng bởi dòng, dùng lệnh step hoặc next.
(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))Khác biệt chính giữa lệnh step và next là lệnh step sẽ khiến chương trình dừng bên trong một hàm trong khi lệnh next thực thi 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 step cũng hiển thị chỉ báo --Call-- khi chương trình gặp lời gọi hàm và --Return-- khi hàm kết thúc. Tại bất kỳ thời điểm nào, chúng ta có thể kiểm tra giá trị của một biến nhất định bằng cách chỉ nhập tên của nó.
Bạn có thể đặt breakpoint trong chương trình bằng lệnh break. Số dòng (nơi breakpoint nên được đặt) phải được cho. Ví dụ break 5 sẽ đặ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 timesKhi lệnh continue được đưa ra, thực thi chương trình sẽ tiếp tục cho đến khi nó gặp breakpoint. Để hiển thị tất cả breakpoint, chỉ cần đưa ra lệnh break không có số dòng.
Bất kỳ breakpoint nào có thể được vô hiệu hóa/bật bằng lệnh disable/enable hoặc xóa hoàn toàn bằng lệnh clear.
(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
Bộ gỡ lỗi Pdb cũng có thể được dùng từ bên trong script Python. Để làm vậy, nhập pdb ở đầu script và 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))Hành vi của bộ gỡ lỗi sẽ hoàn toàn giống như chúng ta thấy trong môi trường dòng lệnh.