EXC_I386_GPFLT, kesinlikle "Genel Koruma hatası" na atıfta bulunuyor; bu, x86'nın size "yapmanıza izin verilmeyen bir şey yaptığınızı" söylemesinin yolu budur. Genellikle bellek sınırları dışında eriştiğiniz anlamına GELMEZ, ancak kodunuzun sınırların dışına çıkması ve bir tür koruma ihlali oluşturacak şekilde kötü kod / verilerin kullanılmasına neden olması olabilir.
Ne yazık ki, daha fazla bağlam olmadan sorunun tam olarak ne olduğunu anlamak zor olabilir, 2005 tarihli AMD64 Programcı El Kitabı, Cilt 2'de listelenen 27 farklı neden var - tüm hesaplara göre, muhtemelen 8 yıl sonra birkaçını eklemiş olacaktı Daha.
64 bitlik bir sistemse, mantıklı bir senaryo, kodunuzun "kanonik olmayan bir işaretçi" kullanmasıdır - bu, 64 bitlik bir adresin, adresin üst 16 bitinin olmayacağı şekilde oluşturulduğu anlamına gelir. alt 48 bitin üstünün tüm kopyaları (başka bir deyişle, bir adresin en üstteki 16 bitinin tümü, 16 bitin hemen altındaki bit bazında 0 veya tümü 1 olmalıdır). Bu kural, mimarinin "adres aralığındaki geçerli bit sayısını güvenli bir şekilde genişletebileceğini" garanti etmek için uygulanmaktadır. Bu, kodun ya bazı işaretçi verilerinin üzerine başka şeyler yazdığını ya da bazı işaretçi değerlerini okurken sınırların dışına çıktığını gösterir.
Bir başka olası neden, bir SSE yazmacıyla hizasız erişimdir - başka bir deyişle, 16 bayt hizalı olmayan bir adresten 16 baytlık bir SSE kaydı okumak.
Söylediğim gibi, birçok olası neden var, ancak bunların çoğu 32 veya 64 bit işletim sisteminde "normal" kodun yapmayacağı şeyleri içeriyor (geçersiz seçici indeksli segment kayıtlarını yüklemek veya MSR'ler (modele özgü kayıtlar)).