[Java] Debug คืออะไร และ ทำอย่างไร ??
สำหรับนักเขียนโปรแกรมมือใหม่หลายท่านอาจจะยังไม่เคยได้ลองใช้การ Debug ซึ่งมักจะมีใน Editor เก่งๆหลายตัว ก่อนอื่นก็ต้องขอแนะนำก่อนเลยครับว่า ปกติแล้ว เวลาเราเขียนโปรแกรมเล็กๆ บางทีก็อาจจะไม่ได้สนใจอะไรมาก เขียนโปรแกรมไป print ค่าออกมาดูแทรกๆไป เพื่อให้เรารู้ว่าค่านั้นมาหรือไม่ หรือ ณ ขณะนั้นมีค่าเท่าไร อะไรประมาณนั้น จริงๆ พวกนี้ผมก็เคยทำ ทั้ง System.out.println หรือ อาจจะใช้เป็น log ที่ดูมีความรู้ขึ้นมาอีกนิด แต่มันก็ยังไม่ดีพอครับ
*จาก NetBeans ขยับมาพัฒนาโปรแกรมด้วย Eclipse เนื่องจากความสามารถที่หลากหลายกว่า (แต่ยุ่งยากไปนิด) ทำให้หลังจากนี้ผมจะอ้างอิงจาก Eclipse เป็นหลักนะครับ ^^
โหมดการรันแบบปกติ (ปุ่มสีเขียว)
ตัวนี้ผมคิดว่าถ้าใครเขียนโปรแกรมด้วย Eclipse คงจะได้กดมันบ่อยพอสมควร (ถ้าไม่ใช้คีย์ลัดนะ) มันก็คือการรันแบบปกติครับ แต่ไอ้การรันแบบปกติเนี่ย มันจะมีการ Optimize โปรแกรมของเราด้วย เพื่อให้มีประสิทธิภาพดียิ่งขึ้น(บ้าง) ทำให้ความเร็วจะเร็วกว่าโหมดอื่น
โหมดการรันแบบดีบัก (ปุ่มแมลง)
ตัวนี้แหละที่ผมจะเป็นประเด็นสำคัญของบทความนี้ โหมด Debug จะทำให้เราสังเกตค่าต่างๆได้ในขณะ Runtime ซึ่งผมได้ทำตัวอย่างไว้ด้านล่างแล้วครับ ^^
อันดับแรก ผมสร้างโปรแกรมขึ้นมาขำๆ ตัวนึงครับ คือ โปรแกรมบวกเลข 2 ตัว จากการกำหนดค่าที่ parameter ครับ เสร็จแล้วให้ลองกดปุ่มแมลงเพื่อรันแบบ Debug
เมื่อเราทำการรันอีกรอบ ก็จะปรากฎ pop-up ตามด้านล่างครับ คือ การยืนยันให้เปลี่ยน perspective* (ขยายความให้ด้านล่างนะครับ) เป็น Debug
หลังจากกด Yes มาก็จะมีการเปลี่ยน perspective เป็นของ Debug และแสดงให้เราเห็นเป็นแถบเขียวๆ ว่าโปรแกรมเรารันถึงบรรทัดไหน ซึ่งจะเป็น Breakpoint จุดแรกที่เรา mark ไว้นั่นเอง
โปรแกรมจะทำต่อจนกระทั่งเจอ Breakpoint ตัวต่อไป ซึ่งเราได้ทำการ mark ไว้ใน method summation() จากตรงนี้ เราจะเริ่มสังเกตการทำงานของโปรแกรมทีละบรรทัด โดยการกด Step Over (F6) >>
Step Over ครั้งที่ 2 >>
Step Over ครั้งที่ 3 >>
จาก Step Over ครั้งที่ 3 เมื่อเรานำเมาส์ไปชี้ที่ตัวแปร result ซึ่งเป็นผลลัพธ์จาก 1234+5678 เราก็สามารถเห็นค่าของ result โดยไม่ต้อง print ออกมา และเมื่อเราไม่ต้องการสังเกตอะไรแล้ว ก็ปล่อยให้มันจบโปรแกรมไปโดยการกด Resume (F8)
จบโปรแกรม...
ทีนี้ ผมจะขยายความ สิ่งต่างๆที่ได้พูดถึงข้างต้น
เครื่องมือนี้ จะมีให้เห็นใน Debug View โดยผมจะพูดที่ใช้บ่อยๆนะ
Resume (F8) คือ ปล่อยให้โปรแกรมทำงานต่อไป
Step Into (F5) คือ เลื่อนไปบรรทัดถัดไป (เข้าไปแบบลึกๆ กันเลยทีเดียว)
Step Over (F6) คือ เลื่อนไปบรรทัดถัดไป
Step Return (F7) คือ เลื่อนไปบรรทัดถัดไป โดยออกมาจากฟังก์ชัน
*จาก NetBeans ขยับมาพัฒนาโปรแกรมด้วย Eclipse เนื่องจากความสามารถที่หลากหลายกว่า (แต่ยุ่งยากไปนิด) ทำให้หลังจากนี้ผมจะอ้างอิงจาก Eclipse เป็นหลักนะครับ ^^
โหมดการรันแบบปกติ (ปุ่มสีเขียว)
ตัวนี้ผมคิดว่าถ้าใครเขียนโปรแกรมด้วย Eclipse คงจะได้กดมันบ่อยพอสมควร (ถ้าไม่ใช้คีย์ลัดนะ) มันก็คือการรันแบบปกติครับ แต่ไอ้การรันแบบปกติเนี่ย มันจะมีการ Optimize โปรแกรมของเราด้วย เพื่อให้มีประสิทธิภาพดียิ่งขึ้น(บ้าง) ทำให้ความเร็วจะเร็วกว่าโหมดอื่น
โหมดการรันแบบดีบัก (ปุ่มแมลง)
ตัวนี้แหละที่ผมจะเป็นประเด็นสำคัญของบทความนี้ โหมด Debug จะทำให้เราสังเกตค่าต่างๆได้ในขณะ Runtime ซึ่งผมได้ทำตัวอย่างไว้ด้านล่างแล้วครับ ^^
อันดับแรก ผมสร้างโปรแกรมขึ้นมาขำๆ ตัวนึงครับ คือ โปรแกรมบวกเลข 2 ตัว จากการกำหนดค่าที่ parameter ครับ เสร็จแล้วให้ลองกดปุ่มแมลงเพื่อรันแบบ Debug
สังเกตว่าก็ไม่ได้ต่างอะไรจากการรันแบบปกติเลยครับ เป็นเพราะว่าเราต้องกำหนด Breakpoint เพื่อระบุจุดทีจะสังเกต คิดว่าเป็นจุดเริ่มต้นการสังเกตก็ได้ครับ เราสามารถกำหนด Breakpoint โดย double click ที่บรรทัดนั้นๆ บริเวณแถบสีเทาด้านหน้า line number นะครับ ซึ่ง Breakpoint จะเป็นกลมๆสีฟ้าๆ
* สำหรับการกำหนด Breakpoint ต้องคิดว่าโปรแกรมจะไม่สามารถทำงานย้อนกลับได้นะครับ เพราะฉะนั้น ถ้า Debug มาหยุดตรงไหนก็ตาม มันก็จะย้อนกลับไปไม่ได้
สังเกตว่าจะยังไม่มีการแสดงผลใดๆที่ console ตอนนี้.. ผมจะปล่อยให้มันรันต่อไปโดยการกด Resume (F8)
โปรแกรมจะทำต่อจนกระทั่งเจอ Breakpoint ตัวต่อไป ซึ่งเราได้ทำการ mark ไว้ใน method summation() จากตรงนี้ เราจะเริ่มสังเกตการทำงานของโปรแกรมทีละบรรทัด โดยการกด Step Over (F6) >>
Step Over ครั้งที่ 2 >>
Step Over ครั้งที่ 3 >>
จาก Step Over ครั้งที่ 3 เมื่อเรานำเมาส์ไปชี้ที่ตัวแปร result ซึ่งเป็นผลลัพธ์จาก 1234+5678 เราก็สามารถเห็นค่าของ result โดยไม่ต้อง print ออกมา และเมื่อเราไม่ต้องการสังเกตอะไรแล้ว ก็ปล่อยให้มันจบโปรแกรมไปโดยการกด Resume (F8)
จบโปรแกรม...
^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
ทีนี้ ผมจะขยายความ สิ่งต่างๆที่ได้พูดถึงข้างต้น
Perspective* คือ หน้าจอการทำงานของเรา โดยปกติจะเป็น Java ซึ่งถ้าเรากด Debug มันจะเตือนให้เราเปลี่ยน perspective เพื่อความเหมะสมสำหรับการ Debug หรือหากทำงานในระดับสูงขึ้นไปเรื่อยๆ ก็อาจมี perspective อื่นๆนอกจากนี้ เช่น Hibernate, Sychronize เป็นต้น
เครื่องมือนี้ จะมีให้เห็นใน Debug View โดยผมจะพูดที่ใช้บ่อยๆนะ
Resume (F8) คือ ปล่อยให้โปรแกรมทำงานต่อไป
Step Into (F5) คือ เลื่อนไปบรรทัดถัดไป (เข้าไปแบบลึกๆ กันเลยทีเดียว)
Step Over (F6) คือ เลื่อนไปบรรทัดถัดไป
Step Return (F7) คือ เลื่อนไปบรรทัดถัดไป โดยออกมาจากฟังก์ชัน