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

หมายเหตุ ค่า  \sin x = \sum^{\infin}_{n=0} \frac{(-1)^n}{(2n+1)!} x^{2n+1}\quad =  x - \frac{x^3}{3!} + \frac{x^5}{5!} - \cdots\mbox{ for all } x

แปลงค่ามาจาก Taylor series ,ให้นิสิตดีบักโปรแกรมที่เพื่อนส่งให้ ให้ทำงานได้ถูกต้อง(ไม่ให้ใช้ class math นะ) ไม่ให้เขียนใหม่

- ให้นิสิตกลับไปลองทำค่า cos ดูเอง (ไม่ต้องส่ง)

-         การส่งให้ส่งเป็น jar file ที่มีโปรแกรมที่ debug แล้วและ text file ที่มีคำตอบของค่า sin อยู่ (ไม่ต้องบอกว่าแก้ตรงไหนในโปรแกรมบ้าง)

เอาซอร์สข้อ 1 ที่นี่

 

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 แล้ว

เอาซอร์สข้อ 2 ที่นี่

การส่ง

ให้แยกเป็น floder ของแต่ละข้อ แล้วทำเป็นไฟล์ rar file (ต้องมีซอร์สโค้ด และ text ของทั้งสองข้อ ตรวจทานให้ดี) แล้วส่งมาที่ progmethcp@gmail.com ภายในวันพุธที่ 18 กรกฎาคม เวลา 24.00 น. ไฟล์จะต้องตั้งชื่อว่า lab07_xxxxxxxxxx.rar โดย xxxxxxxxxx นั้นเป็นเลขประจำตัวนิสิต ส่วนใน subject ของเมล์ ให้ใส่ lab07_ xxxxxxxxxx_Time โดย xxxxxxxxxx นั้นเป็นเลขประจำตัวนิสิต และ Time เป็นเวลา (หน่วยเป็นชั่วโมง:นาที) ที่นิสิตใช้ในการทำแล็บนี้