ในศัพท์แสงในการพัฒนาซอฟต์แวร์ คำว่า 'การดีบัก' เป็นที่นิยมใช้ในการประมวลผลตำแหน่งและแก้ไขข้อผิดพลาดในโปรแกรม ไลบรารีมาตรฐานของ Python มีโมดูล pdb ซึ่งเป็นชุดยูทิลิตี้สำหรับการดีบักโปรแกรม Python
ฟังก์ชันการดีบักถูกกำหนดในคลาส Pdb โมดูลภายในใช้โมดูล bdb และ cmd
โมดูล pdb มีอินเทอร์เฟซบรรทัดคำสั่งที่สะดวกมาก มันถูกนำเข้าในเวลาที่รันสคริปต์ Python โดยใช้ –m switch
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)<module>() -> 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 หรือคำสั่งถัดไป
(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))
ความแตกต่างที่สำคัญระหว่างคำสั่งขั้นตอนและคำสั่งถัดไปคือคำสั่งขั้นตอนนั้นจะทำให้โปรแกรมหยุดภายในฟังก์ชันในขณะที่คำสั่งถัดไปเรียกใช้ฟังก์ชันที่เรียกและหยุดหลังจากนั้น
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)
คำสั่งขั้นตอนยังแสดง --call—บ่งชี้เมื่อโปรแกรมพบการเรียกใช้ฟังก์ชันและ --return--- เมื่อฟังก์ชันสิ้นสุด เราสามารถตรวจสอบค่าของตัวแปรบางตัวได้ตลอดเวลาโดยป้อนชื่อตัวแปร
คุณสามารถตั้งค่าเบรกพอยต์ภายในโปรแกรมได้ด้วยคำสั่ง break ต้องระบุหมายเลขบรรทัด (ซึ่งควรตั้งค่าเบรกพอยต์) ตัวอย่างเช่น 'break 5' จะตั้งค่าเบรกพอยต์ที่บรรทัดที่ 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' การทำงานของโปรแกรมจะดำเนินการจนกว่าจะพบเบรกพอยต์ หากต้องการแสดงจุดสั่งหยุดทั้งหมด ให้ใช้คำสั่งตัวแบ่งปัญหาอย่างง่ายโดยไม่ต้องมีหมายเลขบรรทัด
เบรกพอยต์ใด ๆ สามารถปิดใช้งาน/เปิดใช้งานได้โดยปิดใช้งาน/เปิดใช้งานคำสั่ง หรือล้างทั้งหมดด้วยคำสั่งที่ชัดเจน
(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))
การทำงานของดีบักเกอร์จะเหมือนกับที่เราพบในสภาพแวดล้อมของบรรทัดคำสั่ง