ถามว่าอาการนี้คืออะไร มันคืออาการที่โปรแกรมได้รันคำสั่งตามที่เราเขียนไว้ทุกประการแล้ว แต่เกิดเหตุการณ์ร้ายแรงที่ทำให้มันทำงานต่อไม่ได้ แล้วเหตุการณ์ร้ายแรงพวกนี้คืออะไรบ้าง (จากภาพด้านบนNYRเขียนโค้ด C บน Raspberry Pi นะครับ :) )
- หารจำนวนเต็มด้วย 0
// สำหรับโปรแกรมภาษาอื่นๆอาจจะมีวิธีรับมือกับการหารเลขด้วย 0 ต่างกันไปแล้วแต่ภาษาที่ใช้
- มี pointer พิการแต่อยากไปใช้มัน
คำตอบคือ มันไม่มีค่าอะไรจะส่งมาให้เรา ดังนั้นโปรแกรมก็ไม่รู้ว่าจะทำอย่างไรต่อดี ก็เลยหยุดไว้ก่อนเพียงเท่านั้น
ตัวอย่างเหตุการณ์ที่ทำให้เกิดอาการนี้
- ลืมเช็ค pointer ว่าเป็น null หรือชี้ไปยังข้อมูลก้อนไหนแล้ว
- malloc หรือ calloc ช่องเก็บข้อมูลแล้วแต่ล้มเหลว (อาจจะเพราะ ram หมด)
- เพิ่งจะ free ช่องเก็บข้อมูลที่มาจากการ calloc ไปหยกๆแต่เรียกช่องเก็บข้อมูลชุดเดิมกลับมาใช้อีก
- ปัญหาวน loop จัดการกับ pointer แล้วเงื่อนไขเพี้ยนไม่เป็นไปตามที่ออกแบบ
- ใช้ array ช่องที่เกินขนาดที่จองไว้ (อาจจะเกิดเหตุการณ์ประหลาดหรืออาจจะไม่เกิดก็ได้ และอย่าลืมว่า array สำหรับภาษา c เดิมทีก็ประกอบมาจาก pointer)
ในต่อเมื่อเราพอคาดเดาได้ว่าปัญหาอาจจะเกิดกับอะไรได้บ้าง ที่เหลือก็แค่ลองไปย้อนดูโปรแกรมที่เราเขียนว่ามีช่องโหว่ข้อผิดพลาดตรงไหนบ้าง
อย่าตกใจกับการที่โปรแกรมล่มด้วยลักษณะนี้ เพราะอย่างน้อยเราก็ยังจะมองย้อนไปหาได้ว่ามันผิดพลาดแถวๆไหน ดีกว่าโปรแกรมทำงานผ่านแต่ได้ผลเพี้ยนๆนะครับ
ป.ล. ที่เราเรียกกันติดปากว่า core dumped นั้น จริงๆนั่นไม่ใช่ชื่อของสิ่งที่เกิดขึ้น ในลินุกซ์สิ่งที่เกิดขึ้นเมื่อเกิดอาการนี้คือ Segmentation fault ส่วนคำว่า core dumped นั้นคือลินุกซ์ได้เก็บบันทึกทุกอย่างที่มีในหน่วยความจำของโปรแกรมตอนโปรแกรมล่มเอาไว้เพื่อให้เรานำไปใช้แก้ไขโปรแกรมเรา แต่มันเก็บบันทึกข้อมูลส่วนนี้ไว้ไหนนั้น เราก็ไม่รู้.....
Credit : tonyfqs.blogspot.com
ไม่มีความคิดเห็น:
แสดงความคิดเห็น