การดีบักแอปพลิเคชันเธรด

ในบทนี้เราจะเรียนรู้วิธีการดีบักแอปพลิเคชันเธรด นอกจากนี้เรายังจะได้เรียนรู้ถึงความสำคัญของการดีบัก

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)