Lab
7 Debug
bug(จุดบกพร่อง)
คำนี้เริ่มมีขึ้นมาในทศวรรษ 1940S ในขณะที่คอมพิวเตอร์ยังเป็นการใช้หลอดกันอยู่ เมื่อมีแสงออกมาจากหลอดจะทำให้มี ตัวแมลง
(bugs) บินเข้ามาในเครื่องคอมพิวเตอร์ทำให้เกิดการลัดวงจรและคอมพิวเตอร์ทำงานต่อไปไม่ได้
เมื่อช่างคอมพิวเตอร์เปิดฝาครอบเครื่องออกมาก็พบตัวแมลงนอนตายอยู่ในเครื่องจึงอุทานว่า
bugs ซึ่งหมายถึงว่าตัวแมลง เหล่านี้นี่เองที่ทำให้เครื่องเสีย
หลังจากนั้นแล้ว คำ bug จึงหมายถึง ความผิดพลาดหรือความคลาดเคลื่อนภายในโปรแกรม หรือระบบ ทำให้โปรแกรมไม่สามารถทำงานได้ผลลัพธ์ตามความต้องการ นอกจากนี้
จุดบกพร่องนี้อาจเกิดจากความบก พร่องในตัวเครื่องคอมพิวเตอร์เองก็ได้
lab ที่ 7
นี้จะเป็นเรื่องราวเกี่ยวกับ
debugging หรือการแก้ไขข้อผิดพลาดที่เกิดจากการเขียนโปรแกรมของโปรแกรมเมอร์ บางคนอาจจะรู้สึกว่าหัวข้อนี้ไม่ค่อยสำคัญ เนื่องจากโปรแกรมที่เขียนขึ้นมาไม่ค่อยจะมี
bug อยู่ แต่ในการเขียนโปรแกรมที่มีจำนวนบรรทัดของ
code มากขึ้น
การเขียนโปรแกรมโดยไม่ให้มี bug นั้นเป็นเรื่องที่ทำได้ยาก และบางที เราก็อาจจะจำเป็นต้องทำการแก้ไข
source code ที่ผู้อื่นได้เขียนขึ้นมา
สาเหตุของ Bug ได้แก่
1).SyntaxError
- เกิดจากการพิมพ์ชื่อคำสั่งหรือรูปแบบคำสั่งผิด
ทำให้คอมไพเลอร์ไม่เข้าใจ จะสั่งรันโปรแกรมไม่ได้ถ้ายังไม่แก้ไขปัญหาตรงนี้เสียก่อน
เป็น Error ที่ Debug
ง่ายที่สุด เพราะจะมีเส้นหยักสีแดงให้เห็นใน Eclipse อย่างชัดเจน
ดังรูปที่
1
2).Run-TimeError
- เกิดจากตอนโปรแกรมทำงานแล้วเกิดปัญหา
(Exception) โดยเมื่อเกิดปัญหาเหล่านี้จะเกิดข้อความแจ้งข้อผิดพลาดดังรูปที่ 2 โดยในรูปเป็น Exception ของปัญหา
Divide by Zero
3).LogicError
- เป็น Error ที่เกิดตอนรันเช่นเดียวกับ
Run-Time แต่ต่างกับ Run-Time
Error ตรงที่จะไม่เกิด Exception ใดๆ
แต่ผลลัพธ์จะไม่ตรงกับที่ต้องการ เนื่องจากการใส่โค้ดผิด Logic อาจทำให้เกิด Infinite loop ตัวอย่างเช่นการใส่สูตรการคำนวณผิดเป็นต้น
วิธีการTerminateโปรแกรมในกรณีที่เกิดการติดลูปอนันต์(InfiniteLoop)
1.คลิกเมาส์ขวาที่หน้าจอConsole
2. เลือก Terminate
การสั่ง run ใน
debug
mode
เราสามารถทำการสั่ง run โปรแกรมใน debug modeได้โดยทำการคลิกขวาที่ชื่อไฟล์แล้วเลือก
debug as หรือทำการคลิกที่ tool bar ตรงรูปแมลง
โดยเมื่อสั่งให้ทำการ debug
eclipse จะถามว่าต้องการจะเปลี่ยนเป็น debug perspective หรือไม่(จะมี
ปุ่ม shortcut สำหรับเลือก perspective อยู่ทางขวาบน) โดยที่ใน debug perspective นี้จะเป็น perspective ที่จะเป็นประโยชน์ในการ
debug โปรแกรมเมื่ออยู่ใน debug mode นั้น เราจะสามารถสังเกตค่าของตัวแปรในขณะต่างๆ
ได้ง่ายขึ้นซึ่งช่วยในการ debug
program โดยเราจะสามารถทำการหยุดการ run โปรแกรมได้ขณะที่โปรแกรมนั้นทำงานอยู่ที่จุดต่างๆ โดยอาศัยการใช้
breakpoint และ step
trace โดยค่าของตัวแปรต่างๆจะแสดงอยู่ใน tab variable
ด้านขวาบนใน debug perspective
ใน tab debug ด้านซ้ายบนจะแสดงรายการของการ debug ทั้งหมด การสั่งให้โปรแกรมทำงานในขั้นถัดไปให้กดที่
resume (ลูกศรสีเขียว ที่แถบ debug) มีข้อควรระวังประการหนึ่งก็คือเราอาจจะทำการ
debug หรือ run
โปรแกรมค้างไว้หลายๆครั้ง โดยที่ไม่ทำการ run จนเสร็จ ซึ่งหากมีการ debug เช่นนี้มากๆ
เข้า ก็อาจส่งผลให้ memory
เต็ม และทำให้การทำงานของเรามีปัญหา ดังนั้นจึงควรทำการ
terminate process (กดที่ terminate
สี่เหลี่ยมสีแดงที่แถบ debug ) ที่ไม่ได้ใช้แล้วในหน้าต่างนี้ทุกครั้งที่ไม่ได้ทำการ
run จนจบ(สังเกตได้ว่า process ที่
terminate แล้วจะมี
<terminated> อยู่ข้างหน้า)
การใช้ breakpoint
เราสามารถใช้ breakpoint เพื่อให้โปรแกรมหยุดทำงานชั่วขณะได้เมื่อ
debug มาถึงจุดที่สนใจ โดยเราสามารถที่จะตั้ง breakpoint ได้โดยการดับเบิลคลิกที่หน้าบรรทัดนั้นๆ
หรือคลิกขวาที่บริเวณหน้าบรรทัดที่ตั้งการแล้วเลือก toggle breakpoint
จะได้ดังรูป
ใน eclipse
นั้น เราสามารถกำหนดคุณสมบัติของ
breakpoint แต่ละตัวได้โดยการคลิกขวาที่ breakpoint แล้วเลือก
breakpoint properties โดยจะมีตัวเลือกต่างๆ ดังนี้
1. Enabled - ใช้ breakpoint
นั้นหรือไม่
2. Hit Count - หยุดเมื่อมาถึงจุดนั้นเป็นจำนวนรอบที่กำหนด
3. Enable Condition - หยุดโดยอาศัยเงื่อนไขที่ต้องการ
(เช่น k*j==3)
ในการตั้ง
properties ของ breakpoint นั้น
มีสิ่งที่ควรระวังประการหนึ่งคือผลจากการเลือก option Hit
Count และ Enable
Condition พร้อมกันอาจไม่ส่งผลตามที่
programmer คิดไว้ ซึ่งถ้าใครอยากทราบผลที่จะเกิดขึ้นให้ทำการทดลองเขียนโปรแกรมแล้วใช้
breakpoint เช่นนี้ดู
การใช้ step trace
เมื่อ program ที่ debug หยุดเมื่อมาถึง breakpoint เราสามารถสั่งให้
program ค่อยๆ run
ต่อไปทีละขั้น ได้โดยการใช้ step trace ซึ่งจะช่วยให้เราไม่จำเป็นต้องตั้ง
breakpoint ไว้บ่อยๆเมื่อ program หยุดที่ breakpoint แล้ว เราจะสามารถใช้
คำสั่ง step
ต่างๆ จากปุ่มได้โดยอาศัยกลุ่มของปุ่มที่มีรูปลูกศรใน
tab debug โดยหลักแล้วเราจะใช้กัน 3 ปุ่มคือ step into, step over และ step return
1. step into - step เข้าไปในชั้นย่อยทุกชั้น
2. step over - step ต่อไปในระดับที่เท่ากัน
3. step return - step ออกมา 1 ระดับ
ตัวอย่างของระดับนั้นเช่นว่าหากโปรแกรมที่เรา
debug ทำงานมาถึง จุดที่จะต้องเรียก method, step into จะเข้าไปใน
code ของ method
นั้น ส่วน step over จะไปยังบรรทัดต่อไปเหมือนกับว่า
method นั้นเป็นคำสั่งธรรมดา
เทคนิคที่กล่าวถึงทั้งหมดนี้เป็นสิ่งที่ควรจะรู้ไว้ซึ่งน่าจะสามารถช่วยทุกคนได้ในการ
debug แต่ก็ไม่ได้เป็นการบังคับว่าจะต้องนำไปใช้ในการเขียนโปรแกรม การจะนำเทคนิคเหล่านี้ไปใช้หรือไม่ขึ้นอยู่กับวิจารณญาณของแต่ละคนเอง ตามที่ทุกคนควรจะทราบจากประสบการณ์ที่ผ่านมาแทนที่จะใช้
debug mode เราก็สามารถทราบค่าของตัวแปรแต่ละตัวในขณะต่างๆได้โดยการสั่ง print
ออกมา
ทาง console แต่การมีตัวตนอยู่ของ debug mode นี้ก็น่าจะช่วยให้ programmer
มีความสุขมากยิ่งขึ้น
ปฏิบัติการ
1.เพื่อนของนิสิตได้ทำการเขียนโปรแกรมเพื่อคำควณหาค่า
sin แต่โปรแกรมยังไม่สามารถที่จะทำงานได้จึงให้นิสิตทำการ debug โปรแกรมให้สามารถทำงานได้อย่างถูกต้อง โดยให้นิสิต หาค่า sin ของมุม 30,37,90,180,270 แล้วนำค่าที่ได้ทำเป็น text
file
หมายเหตุ ค่า
แปลงค่ามาจาก Taylor series ,ให้นิสิตดีบักโปรแกรมที่เพื่อนส่งให้
ให้ทำงานได้ถูกต้อง(ไม่ให้ใช้ class
math นะ) ไม่ให้เขียนใหม่่
- ให้นิสิตกลับไปลองทำค่า cos ดูเอง
(ไม่ต้องส่ง)
- การส่งให้ส่งเป็น jar file ที่มีโปรแกรมที่ debug แล้วและ text file ที่มีคำตอบของค่า sin อยู่ (ไม่ต้องบอกว่าแก้ตรงไหนในโปรแกรมบ้าง)
2. เพื่อนของนิสิตได้ทำการเขียนโปรแกรมขึ้นมาหนึ่งโปรแกรม คือ TwentyGameJava แต่โปรแกรมของเขานั้นยังมี bug อยู่(มาก) จึงอยากให้นิสิตทำการ debug
โปรแกรมให้สามารถ
run ได้อย่างถูกต้อง
โดยที่มีกติกาของเกมส์คือ
จะมีผู้เล่นสองผ่าย(ผ่ายหนึ่งคือตัวเราและอีกฝายหนึ่งคือ computer )
โดยจะผลัดกันบอกเลข
คือ 1 หรือ 2
หรือ 3 เท่านั้น
ให้นำเลขของแต่ละฝ่ายมาบวกเพิ่มไปเรื่อย ๆ หากฝ่ายใดบอกเลขแล้วได้ผลรวมเป็น 20
จะเป็นฝ่ายชนะหากบวกแล้วได้มากกว่า 20 ก็จะแพ้
โดยที่นิสิตจะต้องตรวจสอบเรื่องการรับค่าเข้ามาด้วย เช่น หากต้องรับค่าเป็นตัวเลข 1,2,3
แต่หากใส่เลขอื่น
ๆ ที่ไม่ใช่ 1,2,3 หรือ
ใส่เป็นตัวอักษรเข้ามาให้โปรแกรมรับค่าในขั้นตอนนั้นใหม่ด้วย
ให้นิสิตบอกวิธี ในการเล่นเกมส์นี้ให้ชนะ
โดยที่เพื่อนของนิสิตใบ้ให้ว่าถ้าเลือกบอกเลขก่อนจะแพ้อย่างแน่นอนโดยใน text
file ที่ส่งไม่ต้องบอกว่าแก้โปรแกรมตรงไหนบ้าง
หมายเหตุ
- ให้นิสิตดีบักโปรแกรมที่เพื่อนส่งให้ ให้ทำงานได้ถูกต้อง ไม่ให้เขียนใหม่
- โปรแกรมนี้มีการรับค่าและการสุ่มค่า
จึงต้องมี import java.io.*;และ import java.util.Random;
-ให้นิสิตส่งเป็น text file ในการบอกวิธีการเล่นให้ชนะ
และ jar file ที่มีโปรแกรมที่ debug แล้ว
การส่ง
ให้แยกเป็น
floder ของแต่ละข้อ
แล้วทำเป็นไฟล์ rar file (ต้องมีซอร์สโค้ด และ text
ของทั้งสองข้อ
ตรวจทานให้ดี) แล้วส่งมาที่ progmethcp@gmail.com ภายในวันพุธที่ 18
กรกฎาคม
เวลา 24.00 น. ไฟล์จะต้องตั้งชื่อว่า
lab07_xxxxxxxxxx.rar โดย xxxxxxxxxx นั้นเป็นเลขประจำตัวนิสิต ส่วนใน subject
ของเมล์
ให้ใส่ lab07_ xxxxxxxxxx_Time โดย xxxxxxxxxx
นั้นเป็นเลขประจำตัวนิสิต
และ Time เป็นเวลา
(หน่วยเป็นชั่วโมง:นาที) ที่นิสิตใช้ในการทำแล็บนี้