ความผิดพลาดในการแบ่งส่วนคืออะไร?


27

ใน Ubuntu ฉันประสบข้อผิดพลาดในการแบ่งเซ็กเมนต์หลายครั้ง อะไรคือความผิดพลาดของการแบ่งส่วนและเมื่อมันเกิดขึ้น?


1
เพียงเพื่อปกปิด: ฉันมีปัญหาที่คล้ายกันในขณะที่ segfaults ของฉันไม่สามารถทำซ้ำได้อย่างน่าเชื่อถือและพวกเขามาจากการใช้งานแบบสุ่ม (เกือบ) พบว่ามีโอกาสมากที่สุดที่หน่วยความจำของฉันเสีย ดังนั้นหากโปรแกรมใด ๆ ที่ทำให้เกิด segfaults อาจมีการมองที่แรมอย่างใกล้ชิด

คำตอบ:


25

ข้อผิดพลาดที่บอกว่าการแบ่งส่วนความผิดพลาด (หรือsegfaultหรือSIGSEGV ) ใน Ubuntu และระบบปฏิบัติการที่คล้าย Unix อื่น ๆ หรือการพูดข้อบกพร่องการป้องกันทั่วไปใน Windows คือเมื่อโปรแกรมพยายามเข้าถึงส่วนของหน่วยความจำที่ไม่สามารถเข้าถึงได้หรือโปรแกรมใด ถูกห้ามไม่ให้เข้าถึง ความผิดพลาดของการแบ่งกลุ่มเป็นความผิดพลาดของโปรแกรมนั่นคือการเลิกจ้างที่ผิดปกติของโปรแกรม ดูบทความวิกิพีเดียล่ม , การป้องกันหน่วยความจำ , ความผิดส่วน , การป้องกันความผิดทั่วไปและSIGSEGVสำหรับข้อมูลเพิ่มเติม (และมีความเข้าใจมากขึ้นพื้นผิวของหัวข้อกว่าจะนำเสนอที่นี่)

ความผิดพลาดในการแบ่งส่วนนั้นมักจะเกิดจากบั๊กในโปรแกรมที่มันเกิดขึ้น ฉันคาดเดาข้อผิดพลาดการแบ่งกลุ่มส่วนใหญ่หรือทั้งหมดของคุณเกิดขึ้นจากแอปพลิเคชันเดียวกัน โปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับสถานการณ์ภายใต้ข้อบกพร่องของการแบ่งเซ็กเมนต์ที่เกิดขึ้นบนเครื่องของคุณและโปรแกรมใดขัดข้อง โปรดระบุข้อความที่สมบูรณ์ของข้อความแสดงข้อผิดพลาดที่คุณได้รับและข้อความอื่น ๆ ที่ปรากฏก่อนข้อความ สิ่งนี้จะทำให้เราสามารถให้คำแนะนำโดยละเอียดเกี่ยวกับปัญหาของคุณโดยเฉพาะ (ไม่ใช่แค่ข้อมูลทั่วไปเกี่ยวกับความผิดพลาดของการแบ่งส่วน)

วิธีที่ดีที่สุดสำหรับคุณที่จะให้ข้อมูลนี้สำหรับคุณที่จะแก้ไขคำถามของคุณจะรวมไว้ อีกทางเลือกหนึ่งหากคุณต้องการให้คำถามนี้เกี่ยวกับความผิดพลาดของการแบ่งกลุ่มโดยทั่วไปคุณสามารถโพสต์คำถามใหม่เพื่อถามว่าอะไรเป็นพิเศษที่ทำให้เกิดความผิดพลาดในการแบ่งกลุ่มของคุณ (ถ้าคุณทำสิ่งนี้ .


โชคดีที่การแบ่งส่วนทั้งหมดได้รับการแก้ไขโดยการอัปเกรดระบบปฏิบัติการ :) คำถามของฉันเกี่ยวกับความผิดพลาดในการแบ่งกลุ่มโดยทั่วไปไม่ได้มีเฉพาะแอพใดแอพหนึ่ง
Tachyons

@ ฉันไม่ได้พูดถึงฉันได้แก้ไขคำตอบของฉันแล้ว (ฉันยังคงคำแนะนำในการให้ข้อมูลเพิ่มเติมเพื่อประโยชน์ของผู้ใช้รายอื่นที่พบข้อบกพร่องของการแบ่งกลุ่มแม้ว่าฉันรู้ว่าคุณไม่ต้องการความช่วยเหลือเป็นพิเศษกับพวกเขาในตอนนี้)
Eliah Kagan

นี่เป็นข้อผิดพลาดเกี่ยวกับการแบ่งส่วนในแอป ฉันต้องการถามเกี่ยวกับมันที่เกิดขึ้นในโปรแกรม C ++ ซึ่งเป็นโปรแกรมเดียวกันที่ทำงานได้อย่างสมบูรณ์ใน Windows หรือ Turbo C ++ (ในไวน์) (ฉันใช้ anjuta ใน Linux) และนี่เป็นเพียงโปรแกรมพื้นฐานและไม่ใช่แอปพลิเคชัน (โปรแกรมเช่น TREES , GRAPHS, ฯลฯ )
Nirmik

ขอบคุณ. แต่ฉันกลัวในกรณีส่วนใหญ่ที่ถามคำถามเกี่ยวกับความผิดพลาดในการแบ่งเซ็กเมนต์ในแอปเป็นแบบออฟไลน์ที่นี่ :)
Tachyons

@Nirmik: บางทีมันอาจเป็นหัวข้อสำหรับ StackOverflow :)
tachyons

4

ความผิดพลาดของการแบ่งส่วนเกิดจากข้อบกพร่องในแอปพลิเคชัน ในทางเทคนิคหมายความว่าแอปพลิเคชันพยายามอ่านหรือเขียนส่วนหนึ่งของหน่วยความจำที่ไม่ได้เป็นของมัน (หรือไม่มีอยู่) แน่นอนว่าห้ามมิให้อ่านหรือเขียนไปยังหน่วยความจำของผู้อื่นและเมื่อระบบ (เคอร์เนล) ตรวจพบสิ่งนี้มันจะบังคับให้แอปพลิเคชันหยุดทำงาน


0

ไปเป็นวันที่คนใช้ในการติดตามผ่านรหัสประกอบและแก้ปัญหา Abends, Dr Watson, การแบ่งกลุ่มผิดพลาด วันสีเขียวเหล่านั้นหายไป

หนึ่งในสาเหตุของความผิดพลาดในการแบ่งส่วนคือเมื่อรหัสที่มีการเข้าถึงหน่วยความจำโดยตรงล้มเหลว เมื่อชิ้นส่วนของรหัสพยายามเข้าถึงส่วนหน่วยความจำของแอปพลิเคชันอื่นการแบ่งส่วนเกิดข้อผิดพลาด การจัดสรรหน่วยความจำบางครั้งถูกย้ายไปรอบ ๆ เพื่อให้บล็อกหน่วยความจำขนาดใหญ่ติดกันได้รับการจัดสรร ในขณะที่พยายามกู้คืนเคอร์เนลพยายามอย่างหนักเพื่อบันทึกข้อมูลหน่วยความจำทั้งหมดลงในไฟล์สถานะปัจจุบันของแอ็พพลิเคชันทั้งหมดที่รันบน cpu และสถานะ (คำสั่งล่าสุดรัน) ไปยังไฟล์และเพิ่งตาย นอกจากนี้ยังจะพยายามจัดเก็บข้อมูลการกู้คืนมากที่สุดและปิดไฟล์ให้มากที่สุดเท่าที่จะทำได้เพื่อให้ hdd ไม่ได้รับลิงก์ที่เสียหาย

แก้ไขข้อบกพร่องและแก้ไขหากคุณสามารถทำซ้ำได้บ่อยครั้ง หากคุณไม่สามารถทำซ้ำได้เพียงจับมือคุกเข่าลงและอธิษฐานเหมือนนรกที่คุณไม่เห็น "สม่ำเสมอ"


Segfaults สามารถเรียกใช้ในโปรแกรมใด ๆ ที่เขียนด้วยภาษาที่อนุญาตการเข้าถึงหน่วยความจำโดยตรง พวกเขาจะไม่ผิดพลาดเคอร์เนลเช่นกัน
Alex L.

@AlexL นั่นถูกต้อง ฉันจะแก้ไขคำตอบของฉัน
Siddharth

ฉันหวังว่าฉันได้แสดงความคิดของฉันอย่างถูกต้อง
Siddharth

@AlexL คุณช่วยทบทวนอีกครั้งได้ไหม ฉันจะลบมันถ้ามันยังไม่ถูกต้อง
Siddharth

มันดีกว่า ถึงกระนั้นก็ตาม (1) เป็นไปได้ว่ามันยากมากสำหรับโปรแกรมที่จะตั้งSIGSEGVตัวจัดการเป็นอย่างอื่นนอกเหนือจากSIG_DFL(ซึ่งเป็นการถ่ายโอนแกนกลางและทางออกสำหรับ a SIGSEGV) เนื่องจากถ้าคุณเข้าถึงหน่วยความจำที่คุณไม่ควรเป็นอย่างนั้น ผิดและการกู้คืนอาจเป็นไปไม่ได้ (2) คอร์จะถูกทิ้งเมื่อกระบวนการหยุดทำงาน (3) การถ่ายโอนข้อมูลหลักเท่านั้นรวมถึงหน่วยความจำและการลงทะเบียนของกระบวนการที่ถูกทิ้ง (4) กระบวนการอื่น ๆ CPU และ kernal ไม่ได้รับผลกระทบจาก segfault ของกระบวนการอื่น
Alex L.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.