การดีบักแอปพลิเคชันเธรด
ในบทนี้เราจะเรียนรู้วิธีการดีบักแอปพลิเคชันเธรด นอกจากนี้เรายังจะได้เรียนรู้ถึงความสำคัญของการดีบัก
Debugging คืออะไร?
ในการเขียนโปรแกรมคอมพิวเตอร์การดีบักเป็นกระบวนการค้นหาและลบจุดบกพร่องข้อผิดพลาดและความผิดปกติจากโปรแกรมคอมพิวเตอร์ กระบวนการนี้เริ่มต้นทันทีที่โค้ดถูกเขียนและดำเนินต่อไปในขั้นตอนต่อเนื่องเนื่องจากโค้ดถูกรวมเข้ากับหน่วยการเขียนโปรแกรมอื่น ๆ เพื่อสร้างผลิตภัณฑ์ซอฟต์แวร์ การดีบักเป็นส่วนหนึ่งของกระบวนการทดสอบซอฟต์แวร์และเป็นส่วนสำคัญของวงจรชีวิตการพัฒนาซอฟต์แวร์ทั้งหมด
Python Debugger
โปรแกรมดีบัก Python หรือ pdbเป็นส่วนหนึ่งของไลบรารีมาตรฐาน Python เป็นเครื่องมือสำรองที่ดีในการติดตามจุดบกพร่องที่หายากและช่วยให้เราแก้ไขโค้ดที่ผิดพลาดได้อย่างรวดเร็วและเชื่อถือได้ ต่อไปนี้เป็นงานที่สำคัญที่สุดสองประการของไฟล์pdp ดีบักเกอร์ -
- ช่วยให้เราตรวจสอบค่าของตัวแปรในขณะรันไทม์
- เราสามารถก้าวผ่านโค้ดและกำหนดจุดพักได้ด้วย
เราสามารถทำงานกับ pdb ได้สองวิธีต่อไปนี้ -
- ผ่านบรรทัดคำสั่ง; สิ่งนี้เรียกอีกอย่างว่าการแก้จุดบกพร่องหลังการตาย
- โดยรันแบบโต้ตอบ pdb
ทำงานกับ pdb
สำหรับการทำงานกับดีบักเกอร์ Python เราจำเป็นต้องใช้รหัสต่อไปนี้ในตำแหน่งที่เราต้องการเจาะเข้าไปในตัวดีบัก -
import pdb;
pdb.set_trace()
พิจารณาคำสั่งต่อไปนี้เพื่อทำงานกับ pdb ผ่านบรรทัดคำสั่ง
- h(help)
- d(down)
- u(up)
- b(break)
- cl(clear)
- l(list))
- n(next))
- c(continue)
- s(step)
- r(return))
- b(break)
ต่อไปนี้เป็นตัวอย่างคำสั่ง h (help) ของตัวดีบักเกอร์ Python -
import pdb
pdb.set_trace()
--Call--
>d:\programdata\lib\site-packages\ipython\core\displayhook.py(247)__call__()
-> def __call__(self, result = None):
(Pdb) h
Documented commands (type help <topic>):
========================================
EOF c d h list q rv undisplay
a cl debug help ll quit s unt
alias clear disable ignore longlist r source until
args commands display interact n restart step up
b condition down j next return tbreak w
break cont enable jump p retval u whatis
bt continue exit l pp run unalias where
Miscellaneous help topics:
==========================
exec pdb
ตัวอย่าง
ในขณะที่ทำงานกับดีบักเกอร์ Python เราสามารถตั้งค่าเบรกพอยต์ที่ใดก็ได้ในสคริปต์โดยใช้บรรทัดต่อไปนี้ -
import pdb;
pdb.set_trace()
หลังจากตั้งค่าเบรกพอยต์แล้วเราสามารถรันสคริปต์ได้ตามปกติ สคริปต์จะดำเนินการจนถึงจุดหนึ่ง จนกว่าจะมีการกำหนดเส้น พิจารณาตัวอย่างต่อไปนี้ที่เราจะเรียกใช้สคริปต์โดยใช้บรรทัดที่กล่าวถึงข้างต้นในที่ต่างๆในสคริปต์ -
import pdb;
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print (final)
เมื่อเรียกใช้สคริปต์ข้างต้นมันจะดำเนินการโปรแกรมจนถึง a =“ aaa” เราสามารถตรวจสอบสิ่งนี้ได้ในผลลัพธ์ต่อไปนี้
เอาต์พุต
--Return--
> <ipython-input-7-8a7d1b5cc854>(3)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
*** NameError: name 'b' is not defined
(Pdb) p c
*** NameError: name 'c' is not defined
หลังจากใช้คำสั่ง 'p (print)' ใน pdb สคริปต์นี้จะพิมพ์เฉพาะ 'aaa' เท่านั้น ตามมาด้วยข้อผิดพลาดเนื่องจากเราได้ตั้งค่าเบรกพอยต์จนถึง a = "aaa"
ในทำนองเดียวกันเราสามารถรันสคริปต์ได้โดยเปลี่ยนจุดพักและดูความแตกต่างในผลลัพธ์ -
import pdb
a = "aaa"
b = "bbb"
c = "ccc"
pdb.set_trace()
final = a + b + c
print (final)
เอาต์พุต
--Return--
> <ipython-input-9-a59ef5caf723>(5)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
*** NameError: name 'final' is not defined
(Pdb) exit
ในสคริปต์ต่อไปนี้เรากำลังตั้งค่าเบรกพอยต์ในบรรทัดสุดท้ายของโปรแกรม -
import pdb
a = "aaa"
b = "bbb"
c = "ccc"
final = a + b + c
pdb.set_trace()
print (final)
ผลลัพธ์มีดังนี้ -
--Return--
> <ipython-input-11-8019b029997d>(6)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
'aaabbbccc'
(Pdb)