ในภาษาพัฒนาซอฟต์แวร์ คำว่า 'debugging' ใช้กันอย่างแพร่หลายสำหรับกระบวนการค้นหาและแก้ไขข้อผิดพลาดในโปรแกรม ไลบรารีมาตรฐานของ Python มีโมดูล pdb ซึ่งเป็นชุดยูทิลิตี้สำหรับดีบักโปรแกรม Python
ฟังก์ชันการดีบักถูกกำหนดในคลาส Pdb โมดูลใช้ bdb และ cmd โมดูลภายใน
โมดูล pdb มีอินเทอร์เฟซบรรทัดคำสั่งที่สะดวกมาก ถูกนำเข้าในเวลารันสคริปต์ Python โดยใช้สวิตช์ -m:
python -m pdb script.py
เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการทำงานของดีบักเกอร์ ให้เราเขียนโมดูล Python (fact.py) ก่อนดังนี้:
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))
เริ่มดีบักโมดูลนี้จากบรรทัดคำสั่ง ในกรณีนี้ การรันจะหยุดที่บรรทัดแรกในโค้ด โดยแสดงลูกศร (->) ทางซ้าย และสร้างพรอมต์ดีบักเกอร์ (Pdb):
C:\python36>python -m pdb fact.py > c:\python36\fact.py(1)() -> def fact(x): (Pdb)
เพื่อดูรายการคำสั่งดีบักเกอร์ทั้งหมด พิมพ์ 'help' หน้าพรอมต์ดีบักเกอร์ เพื่อรู้เพิ่มเติมเกี่ยวกับคำสั่งใดคำสั่งหนึ่ง ใช้ไวยากรณ์ 'help

คำสั่ง list แสดงโค้ดทั้งหมดพร้อมสัญลักษณ์ -> ทางซ้ายของบรรทัดที่โปรแกรมหยุด:
(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))
เพื่อเคลื่อนที่ผ่านโปรแกรมทีละบรรทัด ใช้คำสั่ง step หรือ next:
(Pdb) step > c:\python36\fact.py(7)() -> if __name__=="__main__": (Pdb) next > c:\python36\fact.py(8) () -> print("factorial of 3 = ", fact(3)) (Pdb) next 1 2 3 factorial of 3= 6 --Return-- > c:\python36\fact.py(8) ()->None -> print("factorial of 3 = ", fact(3))
ความแตกต่างหลักระหว่าง step และ next คือ step จะทำให้โปรแกรมหยุดภายในฟังก์ชัน ในขณะที่ next จะรันฟังก์ชันที่ถูกเรียกและหยุดหลังจากมันเสร็จ:
C:\python36>python -m pdb fact.py > c:\python36\fact.py(1)() -> def fact(x): (Pdb) s > c:\python36\fact.py(7) () -> if __name__=="__main__": (Pdb) n > c:\python36\fact.py(8) () -> 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)
คำสั่ง step ยังแสดง --call-- เมื่อโปรแกรมเจอการเรียกฟังก์ชัน และ --return-- เมื่อฟังก์ชันจบ ในจุดใดก็ตาม เราสามารถตรวจสอบค่าของตัวแปรบางตัวได้โดยเพียงพิมพ์ชื่อมัน
คุณสามารถตั้งจุดหยุด (breakpoints) ภายในโปรแกรมด้วยคำสั่ง break หมายเลขบรรทัด (ที่ควรตั้ง breakpoint) ต้องระบุ ตัวอย่าง 'break 5' จะตั้ง breakpoint ที่บรรทัด 5 ของโปรแกรมปัจจุบัน:
(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
เมื่อออกคำสั่ง 'continue' การรันโปรแกรมจะดำเนินต่อจนกว่าจะเจอ breakpoint เพื่อแสดง breakpoint ทั้งหมด ให้ออกคำสั่ง break โดยไม่มีหมายเลขบรรทัด
จุดหยุดใดก็ตามสามารถปิดใช้งาน/เปิดใช้งานได้ด้วยคำสั่ง disable/enable หรือล้างทั้งหมดด้วยคำสั่ง 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
ดีบักเกอร์ Pdb สามารถใช้จากภายในสคริปต์ Python ได้ด้วย วิธีทำคือ นำเข้า pdb ที่ด้านบนของสคริปต์ และใช้เมธอด set_trace() ภายในโปรแกรม:
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))
พฤติกรรมของดีบักเกอร์จะเหมือนกับที่เราพบในสภาพแวดล้อมบรรทัดคำสั่งทุกประการ