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

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

ในภาษาพัฒนาซอฟต์แวร์ คำว่า '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 '

ดีบักเกอร์ของ 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 หรือ 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))

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