EXC_I386_GPFLT bezieht sich sicherlich auf "Allgemeiner Schutzfehler". Auf diese Weise kann der x86 Ihnen mitteilen, dass "Sie etwas getan haben, was Sie nicht tun dürfen". Dies bedeutet normalerweise NICHT, dass Sie außerhalb der Speichergrenzen zugreifen, aber es kann sein, dass Ihr Code außerhalb der Speichergrenzen liegt und fehlerhafter Code / fehlerhafte Daten auf eine Weise verwendet werden, die zu einer Art Schutzverletzung führt.
Leider kann es schwierig sein, genau herauszufinden, wo das Problem liegt, ohne mehr Kontext. In meinem AMD64-Programmierhandbuch, Band 2 aus dem Jahr 2005 sind 27 verschiedene Ursachen aufgeführt. Nach allen Angaben ist es wahrscheinlich, dass 8 Jahre später einige hinzugekommen wären Mehr.
Wenn es sich um ein 64-Bit-System handelt, ist es plausibel, dass Ihr Code einen "nicht-kanonischen Zeiger" verwendet. Dies bedeutet, dass eine 64-Bit-Adresse so gebildet wird, dass die oberen 16 Bits der Adresse nicht vorhanden sind Alle Kopien der Oberseite der unteren 48 Bits (mit anderen Worten, die oberen 16 Bits einer Adresse sollten alle 0 oder alle 1 sein, basierend auf dem Bit knapp unter 16 Bit). Diese Regel soll sicherstellen, dass die Architektur "die Anzahl der gültigen Bits im Adressbereich sicher erweitern kann". Dies würde darauf hinweisen, dass der Code entweder einige Zeigerdaten mit anderen Dingen überschreibt oder beim Lesen eines Zeigerwerts die Grenzen überschreitet.
Eine weitere wahrscheinliche Ursache ist der nicht ausgerichtete Zugriff mit einem SSE-Register - mit anderen Worten, das Lesen eines 16-Byte-SSE-Registers von einer Adresse, die nicht 16-Byte-ausgerichtet ist.
Es gibt, wie gesagt, viele andere mögliche Gründe, aber die meisten betreffen Dinge, die "normaler" Code in einem 32- oder 64-Bit-Betriebssystem nicht tun würde (wie das Laden von Segmentregistern mit ungültigem Auswahlindex oder das Schreiben in MSRs (modellspezifische Register)).