Notes & software courses · Free to learn
Aph's Blog
On this page

ใช้ Debugger จริง (pdb / VS Code)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

เลิก debug ด้วย print อย่างเดียว — หยุดโปรแกรมแล้วเดินดู state ทีละบรรทัดด้วย debugger

เมื่อโค้ดทำงานไม่เป็นไปตามคาด มือใหม่มักโรย print() ไปทั่วแล้วลบทีหลัง แต่ debugger ให้คุณ "หยุดเวลา" ในโปรแกรมแล้วสำรวจค่าตัวแปรทุกตัวได้ทันที breakpoint เดียวมักบอกได้มากกว่า print สิบบรรทัด — เป็นทักษะที่ช่วยให้แก้บั๊กได้เร็วและตรงจุด

พิมพ์ตามจริง

หัวข้อนี้ต้องลงมือ เปิดไฟล์ .py แล้วลองใส่ breakpoint() รันใน terminal และลองตั้ง breakpoint ใน VS Code — อ่านเฉย ๆ ไม่ทำให้ใช้เป็น

breakpoint() — เริ่มที่ง่ายที่สุด

ตั้งแต่ Python 3.7 แค่ใส่ breakpoint() ตรงจุดที่อยากหยุด เมื่อรันโปรแกรมจะหยุดตรงนั้นและเปิด pdb (Python debugger) ให้พิมพ์คำสั่งสำรวจ

python
def calculate_total(items):
    total = 0
    for item in items:
        breakpoint()          # โปรแกรมหยุดตรงนี้ทุกรอบ
        total += item["price"] * item["qty"]
    return total

calculate_total([{"price": 10, "qty": 2}])

คำสั่ง pdb ที่ใช้บ่อย

เมื่อหยุดที่ breakpoint จะเห็น prompt (Pdb) ให้พิมพ์คำสั่งเหล่านี้สำรวจและเดินโปรแกรม

คำสั่งย่อทำอะไร
nextnรันบรรทัดถัดไป (ไม่เข้าไปในฟังก์ชัน)
stepsรันบรรทัดถัดไป (เข้าไปในฟังก์ชัน)
continuecรันต่อจนถึง breakpoint ถัดไป
printp ตัวแปรแสดงค่าตัวแปร
listlแสดงโค้ดรอบ ๆ จุดที่หยุด
quitqออกจาก debugger
(Pdb) p total          # ดูค่า total ตอนนี้
0
(Pdb) p item           # ดู item ปัจจุบัน
{'price': 10, 'qty': 2}
(Pdb) n                # รันบรรทัดถัดไป
(Pdb) p total
20
(Pdb) c                # รันต่อ

รันทั้งไฟล์ใต้ pdb

bash
python -m pdb myscript.py
# หยุดตั้งแต่บรรทัดแรก พิมพ์ n เดินทีละบรรทัด หรือ c รันจนเจอ error

VS Code debugger (วิธีที่ใช้จริงบ่อยสุด)

ในงานจริงคนนิยม debugger แบบกราฟิกใน editor มากกว่า pdb เพราะเห็นภาพ:

  • คลิกซ้ายของเลขบรรทัดเพื่อตั้ง breakpoint (จุดแดง)
  • กด F5 เพื่อรันแบบ debug — โปรแกรมหยุดที่จุดแดง
  • ดูค่าตัวแปรทั้งหมดในแผง Variables ทางซ้าย
  • Step Over (F10) / Step Into (F11) เดินทีละบรรทัด
  • ดู Call Stack ว่าตอนนี้ถูกเรียกมาจากไหน
  • เลื่อนเมาส์ไปบนตัวแปรเพื่อดูค่าได้ทันที
เปรียบเทียบให้เห็นภาพ

debugger = หยุดเวลาในโปรแกรมแล้วเดินสำรวจทีละก้าว เห็นทุกตัวแปรพร้อมกัน ส่วน print = ส่องไฟฉายทีละจุด ต้องเดาก่อนว่าจะส่องตรงไหน เมื่อ bug ซับซ้อน debugger ประหยัดเวล​ากว่ามาก

สรุปหัวข้อนี้

  • ใส่ breakpoint() เพื่อหยุดโปรแกรมแล้วเปิด pdb
  • คำสั่ง pdb หลัก: n (next), s (step), c (continue), p (print), l (list), q (quit)
  • รันทั้งไฟล์ใต้ debugger: python -m pdb script.py
  • VS Code: คลิกตั้ง breakpoint → F5 → ดู Variables/Call Stack — นิยมสุดในงานจริง
แบบฝึกหัด

1) ใส่ breakpoint() ในฟังก์ชันที่มี loop แล้วใช้ p ดูค่าตัวแปรแต่ละรอบ 2) ลองคำสั่ง n vs s กับโค้ดที่เรียกฟังก์ชันย่อย สังเกตความต่าง 3) ตั้ง breakpoint ใน VS Code แล้วกด F5 ดู Variables 4) เอาโค้ดที่มี bug มาหาจุดผิดด้วย debugger แทน print