EXC_I386_GPFLT si riferisce sicuramente a "errore di protezione generale", che è il modo in cui x86 ti dice che "hai fatto qualcosa che non ti è permesso fare". In genere NON significa che si accede ai limiti di memoria, ma potrebbe essere che il codice stia uscendo dai limiti e causi l'utilizzo di codice / dati errato in un modo che costituisce una violazione della protezione di qualche tipo.
Sfortunatamente può essere difficile capire esattamente quale sia il problema senza più contesto, ci sono 27 diverse cause elencate nel mio Manuale del programmatore AMD64, Vol 2 del 2005 - a detta di tutti, è probabile che 8 anni dopo ne avrei aggiunti alcuni Di Più.
Se è un sistema a 64 bit, uno scenario plausibile è che il tuo codice utilizzi un "puntatore non canonico", il che significa che un indirizzo a 64 bit è formato in modo tale che i 16 bit superiori dell'indirizzo non lo siano tutte le copie dei primi 48 bit inferiori (in altre parole, i primi 16 bit di un indirizzo dovrebbero essere tutti 0 o tutti 1, in base al bit appena sotto i 16 bit). Questa regola è in atto per garantire che l'architettura possa "espandere in modo sicuro il numero di bit validi nell'intervallo di indirizzi". Ciò indicherebbe che il codice sta sovrascrivendo alcuni dati del puntatore con altre cose o sta uscendo dai limiti durante la lettura di un valore del puntatore.
Un'altra probabile causa è l'accesso non allineato con un registro SSE, in altre parole, la lettura di un registro SSE a 16 byte da un indirizzo che non è allineato a 16 byte.
Ci sono, come ho detto, molte altre possibili ragioni, ma la maggior parte di queste riguarda cose che il codice "normale" non farebbe in un sistema operativo a 32 o 64 bit (come il caricamento di registri di segmento con un indice del selettore non valido o la scrittura su MSR (registri specifici del modello)).