Python: Debug code with ipdb

Grassroot Engineer
3 min readDec 29, 2020

--

https://www.elprocus.com/what-is-debugging-types-techniques-in-embedded-systems/

ในการทำงานกับ Python วิธีในการ debug code มีหลายวิธีด้วยกันไม่ว่าจะเป็น

  1. Run editer ด้วย debug mode (เช่น วิธีการตั้งค่า Pycharm debug)

2. สั่ง print เอาเลย ในบรรทัดที่ต้องการตรวจสอบค่า เช่น

import time
print(time.asctime(), 'debugging...') # Print
Tue Dec 29 23:32:41 2020 debugging... # Output

3. ใช้ logging โดยจะ log ออกมาเป็น file เลย

import logginglogging.basicConfig(filename = 'a.log')
log = logging.getLogger()
log.error('Some error')

จะได้ไฟล์ a.log
เมื่อสั่ง cat a.log จะได้

ERROR:root:Some error

หรือเพิ่ม config เข้าไป

import logging# DEBUG, INFO, WARNING, ERROR, CRITICALlog_level = logging.INFO 
logging.basicConfig(filename = 'b.log',
level=log_level,
filemode='w', # or 'a'
format='%(asctime)s %(levelname)s: %(message)s',
)log = logging.getLogger()
log.info('Some info log')
log.debug("Won't print at INFO level")

จะได้ไฟล์ b.log
เมื่อสั่ง cat b.log จะได้

2020-12-29 23:41:33,582 INFO: Some info log

4. วิธีที่ผมชอบใช้อีกวิธีนึง คือ ตั้ง breakpoint ด้วย ipbd มีวิธีใช้แบบนี้นะคับ

pip install ipdb

จากนั้นเมื่อต้องการจะทำ breakpoint ที่ไหน ให้เพิ่ม code เข้าไปลักษณะนี้นะคับ

import ipdb
ipdb.set_trace()

มาดูตัวอย่างกันเลยนะคับ

ลองพิมพ์ code Python ง่ายๆเข้าไป โดยแทรก import ipdb

a = 100

import ipdb
ipdb.set_trace()

b = 50
c = a + b

ผลลัพธ์ใน console คือ โปรแกรมจะไปหยุดเหมือน breakpoint ที่บรรทัดถัดไป

หยุดที่ b = 50
พิมพ์ “n” และ พิมพ์ “p” เพื่อให้ไป next และ print ตามลำดับ, เมื่อต้องการให้รันต่อไปเรื่อยๆก้อพิมพ์ “c” นะคับ หรือ พิมพ์ “q” เมื่อต้องการออกจาก debugger เลย
commands ต่างๆที่ใช้ได้

ps. เราสามารถสั่ง run แบบ line by line ตั้งแต่ต้นเลย โดยให้เพิ่ม “-m ipdb” แทรกเข้าไประหว่างการรันปกติที่พิมพ์แค่ “python test_ipdb.py” นะคับ

python -m ipdb test_ipdb.py
วิธีรันแบบ line by line

ps: เราสามารถจัด format ของ response ที่ออกมา เพื่อให้อ่านง่ายด้วยการพิมพ์ ppนำหน้า

จัด format ใน ipdb ด้วยการเติม pp นำหน้า

หรือกด ll เพื่อดู line ที่ ipdb อยุ่

กด แอล แอล เพื่อดู Line
  • กรณีที่ต้องการ ipdb in the loop จะออกจาก loop ได้แบบนี้ครับ
import os; os.system('kill -9 %d' % os.getpid())

หรือ

j <25>  # เป็นการ jump โดยระบุ line number ให้ออกไปนอก loop ได้เลย สะดวกมากๆ

แล้วพบกันใหม่คับ

--

--

Grassroot Engineer
Grassroot Engineer

Written by Grassroot Engineer

ATM engineer who is interested in CODING and believe in EFFORT. — https://grassrootengineer.com

No responses yet