ใน Ubuntu ฉันประสบข้อผิดพลาดในการแบ่งเซ็กเมนต์หลายครั้ง อะไรคือความผิดพลาดของการแบ่งส่วนและเมื่อมันเกิดขึ้น?
ใน Ubuntu ฉันประสบข้อผิดพลาดในการแบ่งเซ็กเมนต์หลายครั้ง อะไรคือความผิดพลาดของการแบ่งส่วนและเมื่อมันเกิดขึ้น?
คำตอบ:
ข้อผิดพลาดที่บอกว่าการแบ่งส่วนความผิดพลาด (หรือsegfaultหรือSIGSEGV ) ใน Ubuntu และระบบปฏิบัติการที่คล้าย Unix อื่น ๆ หรือการพูดข้อบกพร่องการป้องกันทั่วไปใน Windows คือเมื่อโปรแกรมพยายามเข้าถึงส่วนของหน่วยความจำที่ไม่สามารถเข้าถึงได้หรือโปรแกรมใด ถูกห้ามไม่ให้เข้าถึง ความผิดพลาดของการแบ่งกลุ่มเป็นความผิดพลาดของโปรแกรมนั่นคือการเลิกจ้างที่ผิดปกติของโปรแกรม ดูบทความวิกิพีเดียล่ม , การป้องกันหน่วยความจำ , ความผิดส่วน , การป้องกันความผิดทั่วไปและSIGSEGVสำหรับข้อมูลเพิ่มเติม (และมีความเข้าใจมากขึ้นพื้นผิวของหัวข้อกว่าจะนำเสนอที่นี่)
ความผิดพลาดในการแบ่งส่วนนั้นมักจะเกิดจากบั๊กในโปรแกรมที่มันเกิดขึ้น ฉันคาดเดาข้อผิดพลาดการแบ่งกลุ่มส่วนใหญ่หรือทั้งหมดของคุณเกิดขึ้นจากแอปพลิเคชันเดียวกัน โปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับสถานการณ์ภายใต้ข้อบกพร่องของการแบ่งเซ็กเมนต์ที่เกิดขึ้นบนเครื่องของคุณและโปรแกรมใดขัดข้อง โปรดระบุข้อความที่สมบูรณ์ของข้อความแสดงข้อผิดพลาดที่คุณได้รับและข้อความอื่น ๆ ที่ปรากฏก่อนข้อความ สิ่งนี้จะทำให้เราสามารถให้คำแนะนำโดยละเอียดเกี่ยวกับปัญหาของคุณโดยเฉพาะ (ไม่ใช่แค่ข้อมูลทั่วไปเกี่ยวกับความผิดพลาดของการแบ่งส่วน)
วิธีที่ดีที่สุดสำหรับคุณที่จะให้ข้อมูลนี้สำหรับคุณที่จะแก้ไขคำถามของคุณจะรวมไว้ อีกทางเลือกหนึ่งหากคุณต้องการให้คำถามนี้เกี่ยวกับความผิดพลาดของการแบ่งกลุ่มโดยทั่วไปคุณสามารถโพสต์คำถามใหม่เพื่อถามว่าอะไรเป็นพิเศษที่ทำให้เกิดความผิดพลาดในการแบ่งกลุ่มของคุณ (ถ้าคุณทำสิ่งนี้ .
ความผิดพลาดของการแบ่งส่วนเกิดจากข้อบกพร่องในแอปพลิเคชัน ในทางเทคนิคหมายความว่าแอปพลิเคชันพยายามอ่านหรือเขียนส่วนหนึ่งของหน่วยความจำที่ไม่ได้เป็นของมัน (หรือไม่มีอยู่) แน่นอนว่าห้ามมิให้อ่านหรือเขียนไปยังหน่วยความจำของผู้อื่นและเมื่อระบบ (เคอร์เนล) ตรวจพบสิ่งนี้มันจะบังคับให้แอปพลิเคชันหยุดทำงาน
ไปเป็นวันที่คนใช้ในการติดตามผ่านรหัสประกอบและแก้ปัญหา Abends, Dr Watson, การแบ่งกลุ่มผิดพลาด วันสีเขียวเหล่านั้นหายไป
หนึ่งในสาเหตุของความผิดพลาดในการแบ่งส่วนคือเมื่อรหัสที่มีการเข้าถึงหน่วยความจำโดยตรงล้มเหลว เมื่อชิ้นส่วนของรหัสพยายามเข้าถึงส่วนหน่วยความจำของแอปพลิเคชันอื่นการแบ่งส่วนเกิดข้อผิดพลาด การจัดสรรหน่วยความจำบางครั้งถูกย้ายไปรอบ ๆ เพื่อให้บล็อกหน่วยความจำขนาดใหญ่ติดกันได้รับการจัดสรร ในขณะที่พยายามกู้คืนเคอร์เนลพยายามอย่างหนักเพื่อบันทึกข้อมูลหน่วยความจำทั้งหมดลงในไฟล์สถานะปัจจุบันของแอ็พพลิเคชันทั้งหมดที่รันบน cpu และสถานะ (คำสั่งล่าสุดรัน) ไปยังไฟล์และเพิ่งตาย นอกจากนี้ยังจะพยายามจัดเก็บข้อมูลการกู้คืนมากที่สุดและปิดไฟล์ให้มากที่สุดเท่าที่จะทำได้เพื่อให้ hdd ไม่ได้รับลิงก์ที่เสียหาย
แก้ไขข้อบกพร่องและแก้ไขหากคุณสามารถทำซ้ำได้บ่อยครั้ง หากคุณไม่สามารถทำซ้ำได้เพียงจับมือคุกเข่าลงและอธิษฐานเหมือนนรกที่คุณไม่เห็น "สม่ำเสมอ"
SIGSEGV
ตัวจัดการเป็นอย่างอื่นนอกเหนือจากSIG_DFL
(ซึ่งเป็นการถ่ายโอนแกนกลางและทางออกสำหรับ a SIGSEGV
) เนื่องจากถ้าคุณเข้าถึงหน่วยความจำที่คุณไม่ควรเป็นอย่างนั้น ผิดและการกู้คืนอาจเป็นไปไม่ได้ (2) คอร์จะถูกทิ้งเมื่อกระบวนการหยุดทำงาน (3) การถ่ายโอนข้อมูลหลักเท่านั้นรวมถึงหน่วยความจำและการลงทะเบียนของกระบวนการที่ถูกทิ้ง (4) กระบวนการอื่น ๆ CPU และ kernal ไม่ได้รับผลกระทบจาก segfault ของกระบวนการอื่น