EXC_I386_GPFLT, безусловно, имеет в виду «общую ошибку защиты», которая является способом x86 сказать вам, что «вы сделали то, что вам не разрешено». Обычно это НЕ означает, что вы обращаетесь за пределами памяти, но может случиться так, что ваш код выходит за границы и приводит к использованию плохого кода / данных таким образом, который приводит к некоторому нарушению защиты.
К сожалению, может быть трудно точно определить, в чем проблема, без дополнительного контекста, в моем Руководстве программиста AMD64, том 2 от 2005 года, перечислено 27 различных причин - по всем оценкам, вероятно, что 8 лет спустя добавилось бы несколько Больше.
Если это 64-битная система, вероятным сценарием является то, что ваш код использует «неканонический указатель» - это означает, что 64-битный адрес сформирован таким образом, что старшие 16 бит адреса не все копии верхних 48 нижних битов (другими словами, все верхние 16 бит адреса должны быть 0 или все 1, в зависимости от бита чуть ниже 16 бит). Это правило применяется, чтобы гарантировать, что архитектура может «безопасно увеличить количество действительных битов в диапазоне адресов». Это будет означать, что код либо перезаписывает некоторые данные указателя другим материалом, либо выходит за пределы при чтении некоторого значения указателя.
Другой вероятной причиной является невыровненный доступ к регистру SSE - другими словами, чтение 16-байтового регистра SSE с адреса, который не выровнен по 16 байтам.
Как я уже сказал, существует множество других возможных причин, но большинство из них связаны с вещами, которые «нормальный» код не мог бы делать в 32- или 64-разрядной ОС (например, загрузка регистров сегмента с недопустимым индексом селектора или запись в MSR (регистры конкретной модели)).
Часто информацию можно получить из файлов заголовков. Например:
Хорошо, так что это общая неисправность защиты (как следует из названия). Поиск в Google "общая ошибка защиты i386" дает много совпадений, но это выглядит интересно:
Это
13
соответствует тому, что мы видели в файлах заголовков, так что похоже на то же самое. Однако с точки зрения прикладного программиста это просто означает, что мы ссылаемся на память, которой не должны быть, и на самом деле не имеет значения, как она реализована на оборудовании.источник
Мне было интересно, почему это появилось во время моих модульных тестов.
Я добавил объявление метода в протокол, который включает
throws
; но потенциально бросающий метод даже не использовался в этом конкретном тесте. Включение зомби в тест звучало слишком сложно.Оказалось, что чистка ⌘K сделала свое дело. Я всегда поражаюсь, когда это решает настоящие проблемы.
источник
У меня было аналогичное исключение в Swift 4.2. Я потратил около получаса, пытаясь найти ошибку в моем коде, но проблема исчезла после закрытия Xcode и удаления папки с производными данными. Вот ярлык:
источник
В моем случае ошибка была выдана в Xcode при запуске приложения на симуляторе iOS. Хотя я не могу ответить на конкретный вопрос «что означает ошибка», я могу сказать, что помогло мне, возможно, это также поможет другим.
Решение для меня было
Erase All Content and Settings
в симуляторе иClean Build Folder...
в Xcode.источник
У меня возникла эта проблема при выходе из представления (вернуться к предыдущему представлению).
причина была в том, что
Измените,
safeAreaLayoutGuide
чтобыself
решить проблему.Значение выравнивает представление с ведущим, конечным, верхним и нижним супервизором вместо безопасной области)
источник
Это случилось со мной, потому что Xcode, похоже, не понравился мне, используя одно и то же имя переменной в двух разных классах (которые соответствуют одному и тому же протоколу, если это имеет значение, хотя имя переменной не имеет ничего общего ни с одним протоколом). Я просто переименовал свою новую переменную.
Мне пришлось войти в сеттеры, где он вылетал, чтобы увидеть это во время отладки. Этот ответ относится к iOS
источник
Если ошибка возникает внутри замыкания, которое определяется
self
какunowned
, вы можете быть ограничены в том, что вы можете получить, и получите этот код ошибки в определенных ситуациях. Особенно при отладке. Если это так, попробуйте перейти[unowned self]
на[weak self]
источник
Я получил эту ошибку при этом:
Он исчез, когда я вернулся к:
источник
Для меня это проблема, связанная с раскадровкой, есть возможность сборки ViewController для iOS 9.0 и более поздних версий, ранее установленных для iOS 10.0 и более поздних версий. На самом деле я хочу понизить версию с 10 до iOS 9.3.
источник