Developer Logs

Debugging odoo with python pdb

odoo
python
debugging

Crucial skill for developers especially in the age of AI

Days: 20 | Publish : 25/05/2025

Debugging
              

หนึ่งในสกิลที่เหล่า Developer ควรจะมีติดตัวไว้ ยิ่งในยุคที่ AI เข้ามาแทนที่งานหลาย ๆ อย่างของเหล่า dev ไปด้วยแล้วนั้น ก็คือสกิลในการ Debugging …


คุยกันเพิ่มนิดนึงว่าแล้วเราได้ประโยชน์อะไรจากการเราสามารถ debug ได้บ้างล่ะ ? เอาแบบเป็นหัวข้อใหญ่ ๆ ที่เราพอจะเห็นภาพได้

  1. แก้ไขปัญหาได้รวดเร็ว
  2. รู้จัก framework ในเชิงลึก
  3. ยกระดับวิธีการคิดในการแก้ไขปัญหา
  4. แก้ไขปัญหาที่ซับซ้อนได้ ซึ่งเหนือสิ่งอื่นใด พอเราสามารถทำได้ทุกข้อที่กล่าวมาแล้วนั้น ก็ส่งผลให้ value ของตัวเองมากยิ่งขึ้นตามไปด้วย ซึ่งก็จะส่งผลโดยตรงต่อการต่อรองทั้งเรื่อง ตำแหน่งหน้าที่เพิ่มมากขึ้น รวมไปถึงค่าตอบแทนที่เหมาะสม เพราะสกิลที่เพิ่มขึ้นของเราด้วยนั่นแหละ

เอาล่ะ . . ทีนี้การ debug ให้ได้เริ่มน่าสนใจขึ้นมาอีกขั้นแล้วยังล่ะครับ ?


ไป debug กัน

ซึ่งวันนี้ผมจะยกตัวอย่างการ Debug ใน stack ที่ต้องทำงานกับ Docker ซึ่งการ Debug ก็จะไม่ได้ config แบบปกติแล้วล่ะ

แล้วต้องรู้อะไรบ้างล่ะ ? โจทย์ : Debug odoo ที่รันอยู่บน docker service โดยใช้ python pdb ในการ debugging

ขั้นแรกเราต้องเปิดให้ odoo service สามารถรับ io และสามารถ connect เข้าไปได้ โดยเราจะต้องเพิ่ม attributes ไปที่ docker-compose.yml


  stdin_open: true
  tty: true

ถ้าเรามาดูที่ไฟล์ docker-compose.yml กันก็จะได้หน้าตาประมาณนี้


  services:
    web-data:
      image: odoo:14.0
      depends_on:
        - db
      ports:
        - "8069:8069"
      volumes:
        - odoo-web-data:/var/lib/odoo
      stdin_open: true
      tty: true

ถ้าทำตามนี้เรียบร้อย

เราก็จะได้ docker container ที่พร้อมสำหรับการ connect เข้าไปเรียบร้อย อ๊ะ ๆ แต่อย่าลืมครับ ว่าตอนนี้เรากำลังจะ debug สิ่งหนึ่งที่ต้องทำก่อนจะสามารถ debug ได้ ก็คือ add Breakpoint ลงไปในจุดที่เราต้องการจะ debug เพื่อให้ตัวโปรแกรมหยุดการทำงาน ตอนที่เจอ breakpoint

ซึ่งการเรียกใช้ pdb ก็ไม่ได้ซับซ้อนอะไร แค่เรียก import pdb; pdb.set_trace() คั่นไว้ในส่วนที่เราต้องการ

  1. จากนั้นเราก็สั่ง docker compose up -d
  2. docker ps เพื่อเอา id หรือ ชื่อ container มาใช้ในการเข้าไป debug ใน odoo service
  3. เมื่อได้ container id จากข้อ 2 แล้ว เราก็ใช้ docker attach <container_id>

มาถึงตรงนี้ก็สลับกลับไปที่หน้า application แล้วก็ทำการเรียก action ที่จะทำให้ฟังก์ชันที่เราต้องการ debug ถูกเรียกขึ้นมา

หลังจากนั้นหน้า application จะหยุดโหลดค้างไป ในจังหวะที่ไปเข้า breakpoint ให้เรากลับไปที่ console ก็จะเห็นว่ามันเข้า pdb ไปเรียบร้อย

ส่วน pdb จะไปยังไงต่อ ลองดูพวก pdb shortcut ต่าง ๆ หรือ cheat sheet นี้ก็ได้ครับ Ref: https://kapeli.com/cheat_sheets/Python_Debugger.docset/Contents/Resources/Documents/index


ตัวอย่างในการใช้ pdb


  a = 1
  b = 2

  c = a + b
  d = a * b * c
  import pdb; pdb.set_trace()
  e = a + a * b

ถ้าเราทำการ execute ฟังก์ชันนี้ breakpoint จะไปหยุดอยู่ตรงบรรทัดก่อนหน้าตัวแปร e ซึ่งเราจะสามารถ print ค่าต่าง ๆ ที่อยู่ก่อนหน้านั้นออกมาได้ทั้งหมด เพื่อจะได้รู้ว่า ตัวแปรต่าง ๆ ที่เราเรียกใช้ในจังหวะที่ breakpoint อยู่ตรงนี้ มีค่าเป็นเท่าไร


  (pdb)$: a
  1
  (pdb)$: c
  3
  (pdb)$: d
  6

ซึ่งพอเราสามารถรู้ค่าของแต่ละตัวแปรในจังหวะที่ breakpoint อยู่ ก็ช่วยให้สามารถวิเคราะห์ปัญหาได้ดีมากยิ่งขึ้น หรือเรียกได้ว่าไม่ต้องเดา เพราะ debugging ออกมาให้เห็นได้เลยว่าตัวแปรนั้น มีค่าเป็นเท่าไร


ก็จะเห็นได้ว่าการ Debugging เป็นสกิลนึงที่ช่วยให้เราสามารถรู้ปัญหาได้ตรงจุด รู้ลึกไปถึงว่าในจังหวะที่เราเรียก breakpoint ตัวแปรที่มีปัญหา มีค่าเป็นยังไง ได้ผลลัพธ์ตามที่เราต้องการหรือไม่ได้ ? ซึ่งก็ส่งผลให้สามารถแก้ไขปัญหาได้ถูกจุด แบบไม่ต้องเดา รวมถึงสามารถรู้ได้ด้วย ว่าปัญหาที่เกิด แท้จริงแล้วเป็นปัญหามาจากอะไร ซึ่งหลายต่อหลายครั้ง มักจะเกิดจากการที่เราเรียกตัวแปรไป ณ จุดใดจุดหนึ่ง แล้วมันดันวิ่งไปเข้า function อื่น ๆ ของตัว framework ต่อ จนเกิดการ override หรือเรียกวนซ้ำจนทำให้ผลลัพธ์ที่เราต้องการมันผิดไปจากที่เราตั้งใจไว้

ก็เชิญชวนฮะ ว่าอย่างน้อยก็ลอง debug กันดูเถอะครับ จะได้ยกระดับการแก้ไขปัญหา รวมถึง code quality ของเราก็จะสูงยิ่งขึ้นไปด้วย

>_JV