EXC_I386_GPFLT หมายถึง "ความผิดปกติของการป้องกันทั่วไป" ซึ่งเป็นวิธีการของ x86 ที่จะบอกคุณว่า "คุณทำบางอย่างที่คุณไม่ได้รับอนุญาตให้ทำ" โดยทั่วไปไม่ได้หมายความว่าคุณเข้าถึงหน่วยความจำนอกขอบเขต แต่อาจเป็นไปได้ว่ารหัสของคุณกำลังอยู่นอกขอบเขตและทำให้รหัส / ข้อมูลไม่ถูกต้องถูกนำไปใช้ในลักษณะที่ทำให้เกิดการละเมิดการป้องกันในบางประเภท
น่าเสียดายที่อาจเป็นเรื่องยากที่จะเข้าใจว่าปัญหาคืออะไรหากไม่มีบริบทเพิ่มเติมมี 27 สาเหตุที่แตกต่างกันที่ระบุไว้ในคู่มือโปรแกรมเมอร์ AMD64 ของฉันฉบับที่ 2 จากปี 2548 - โดยบัญชีทั้งหมดมีแนวโน้มว่า 8 ปีต่อมาจะมีการเพิ่มบางส่วน มากกว่า.
หากเป็นระบบ 64 บิตสถานการณ์ที่เป็นไปได้คือโค้ดของคุณกำลังใช้ "ตัวชี้ที่ไม่ใช่มาตรฐาน" ซึ่งหมายความว่าที่อยู่ 64 บิตถูกสร้างขึ้นในลักษณะที่ 16 บิตบนของที่อยู่ไม่ได้ สำเนาทั้งหมดที่อยู่ด้านบนสุดของ 48 บิตที่ต่ำกว่า (กล่าวคือ 16 บิตบนสุดของแอดเดรสทั้งหมดควรเป็น 0 หรือทั้งหมด 1 ตามบิตที่ต่ำกว่า 16 บิต) กฎนี้มีไว้เพื่อรับประกันว่าสถาปัตยกรรมสามารถ "ขยายจำนวนบิตที่ถูกต้องในช่วงที่อยู่" ได้อย่างปลอดภัย สิ่งนี้จะบ่งชี้ว่ารหัสกำลังเขียนทับข้อมูลตัวชี้บางส่วนด้วยข้อมูลอื่น ๆ หรืออยู่นอกขอบเขตเมื่ออ่านค่าตัวชี้บางค่า
สาเหตุที่เป็นไปได้อีกประการหนึ่งคือการเข้าถึงที่ไม่สอดคล้องกับการลงทะเบียน SSE หรืออีกนัยหนึ่งคือการอ่านการลงทะเบียน SSE 16 ไบต์จากที่อยู่ที่ไม่ได้จัดแนว 16 ไบต์
มีดังที่ฉันได้กล่าวไปแล้วว่าสาเหตุที่เป็นไปได้อื่น ๆ อีกมากมาย แต่ส่วนใหญ่เกี่ยวข้องกับสิ่งที่โค้ด "ปกติ" จะไม่ทำในระบบปฏิบัติการ 32- หรือ 64 บิต (เช่นการโหลดส่วนการลงทะเบียนด้วยดัชนีตัวเลือกที่ไม่ถูกต้องหรือการเขียนถึง MSR (รีจิสเตอร์เฉพาะรุ่น))