EXC_I386_GPFLT, безумовно, посилається на "Загальна помилка захисту", що є способом x86 сказати вам, що "ви зробили щось, чого вам не дозволено робити". Зазвичай це НЕ означає, що ви отримуєте доступ за межі пам'яті, але це може бути так, що ваш код виходить за межі і спричиняє використання неправильного коду / даних таким чином, що захищає захист певним чином.
На жаль, важко зрозуміти, в чому полягає проблема, не маючи більше контексту. У моєму посібнику програміста AMD64, том 2 від 2005 року, є 27 різних причин - за всіма відомостями, ймовірно, що через 8 років було б додано декілька більше.
Якщо це 64-бітова система, правдоподібним сценарієм є те, що ваш код використовує "неканонічний покажчик" - це означає, що 64-бітна адреса формується таким чином, що верхні 16 біт адреси не є всі копії верхньої частини нижнього 48 біта (іншими словами, верхня 16 біт адреси повинна бути 0 або всі 1, виходячи з біта трохи нижче 16 біт). Це правило діє для гарантії того, що архітектура може "безпечно розширити кількість дійсних бітів в діапазоні адрес". Це вказувало б на те, що код або перезаписує деякі дані вказівника з іншими матеріалами, або виходить за межі, читаючи якесь значення вказівника.
Інша ймовірна причина - нерівномірний доступ з регістром SSE - інакше кажучи, зчитування 16-байтового SSE-регістра з адреси, яка не вирівняна 16-байтним.
Як я вже сказав, є багато інших можливих причин, але більшість з них пов'язані з тим, що "нормальний" код не робиться в 32- або 64-бітній ОС (наприклад, завантаження сегментних регістрів з недійсним селекторним індексом або запис у MSR (типові конкретні регістри)).