Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ดีบักเกอร์ Python (pdb)


ในศัพท์แสงในการพัฒนาซอฟต์แวร์ คำว่า 'การดีบัก' เป็นที่นิยมใช้ในการประมวลผลตำแหน่งและแก้ไขข้อผิดพลาดในโปรแกรม ไลบรารีมาตรฐานของ 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 '

ดีบักเกอร์ Python (pdb)

คำสั่ง 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))

การทำงานของดีบักเกอร์จะเหมือนกับที่เราพบในสภาพแวดล้อมของบรรทัดคำสั่ง