Что'о смысле исключений код "и EXC_I386_GPFLT и"?

Что'о смысле исключений код EXC_I386_GPFLT?

Ее смысл в зависимости от ситуации?

В таком случае, я'м говоря exc_bad_access и типа исключение с исключением кода EXC_I386_GPFLT

Программа разработана в Xcode 5.0.1, общаясь с cblas_zgemm()` библиотеки Блас.(Ну, я предполагаю, что это не'т материи...)

Большое спасибо!

EXC_I386_GPFLT, безусловно, со ссылкой на "общем я виновата защита&;, который является х86's путь, чтобы сказать вам, что "вы сделали то, что вам не позволено делать то". Это, как правило, не'Т означает, что вы получаете доступ к памяти границы, но это может быть, что ваш код будет в ауте и причиной плохой код/данные, которые будут использоваться в пути, который делает для защиты нарушение какое-то.

К сожалению это может быть трудно выяснить точно, в чем проблема Без больше контекста, есть 27 различных причин, перечисленных в моем amd64 на программиста's руководство, Том 2 с 2005 - по всем признакам, вполне вероятно, что спустя 8 лет добавил бы еще несколько.

Если это 64-разрядная система, вероятный сценарий заключается в том, что ваш код использует и"нестандартный указатель на" - это означает, что 64-битный адрес формируется таким образом, что старшие 16 бит адреса не'т все копии, лучшие из 48 битов (другими словами, топ-16 бит адреса должен быть 0 или все 1, на основе битовых чуть ниже 16 бит). Это правило находится в месте, чтобы гарантировать, что архитектура может "и смело расширить число действительных битов в адресе и quot диапазона;. Это означает, что код находится либо заменяя некоторые данные указателя с другими делами, или ухожу в аут при чтении какое-то значение указателя.

Еще одной вероятной причины невыровненного доступа с реестра МРЗ - другими словами, чтение 16-байтный регистр ГСП с адреса, что это'Т 16-байтовое выравнивание.

Есть, как я уже сказал, много других возможных причин, но большинство из них подразумевают все, что "нормальный" и код не'т делать в 32 - или 64-разрядной операционной системы (например, загрузки сегмента регистров с поврежденных селектор индекс или написав МСР'ы (модель-специфичных регистров)).

Комментарии (0)

Вы часто можете получить информацию из заголовка файлов. Например:

$ cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
$ find usr -name \*.h -exec fgrep -l EXC_I386_GPFLT {} \;
usr/include/mach/i386/exception.h
^C
$ more usr/include/mach/i386/exception.h
....
#define EXC_I386_GPFLT          13      /* general protection fault     */

Итак, это'с общей ошибке защиты (как его имя предполагает, во всяком случае). Погугли "В общем я защита для i386 вина&; дает много просмотров, но это выглядит интересные:

защита памяти осуществляется также с помощью дескрипторов сегментов. сначала процессор проверяет, является ли значение, загружаемое в сегменте реестр ссылается на допустимый дескриптор. Затем он проверяет, что каждый линейный адрес фактического расчета находится в пределах сегмента. Также тип доступа (чтение, запись или выполнение) проверяется по информация в дескрипторе сегмента. Всякий раз, когда одна из этих проверок не удается, исключение (прерывание) 13 (шестнадцатеричный 0d с) поднимается. Это исключение назвал общую ошибку защиты (GPF).

Что 13 соответствует тому, что мы видели в заголовочных файлах, так что, похоже, то же самое. Однако от прикладного программиста's не точка зрения, это просто означает, что мы'вэ ссылки на память, мы должны'т быть, и это'ы не'т действительно важно, как это'ы, реализованные на аппаратном уровне.

Комментарии (1)

Для отладки и найти источник: Включить зомби для приложения (схемы продукта) и запустить инструменты, выбрать зомби. Запустить приложение в Xcode Затем перейдите к инструменты начать запись. Вернуться в ваше приложение и попробуйте создать ошибку. Инструменты должны обнаружить плохое слово (зомби), если он есть.

Надеюсь, что это помогает!

Комментарии (1)

Я удивился, почему это появилось в моей модульные тесты.

Я добавил объявление метода в протокол который включал бросает; но испортите способ вовсе'т даже использовать в конкретном тесте. Включение зомби в тесте звучал как-то слишком хлопотно.

Получается ⌘K чистых сделали свое дело. Я'm всегда flabberghasted, когда это решает актуальные проблемы.

Комментарии (1)

У меня было аналогичное исключение в Swift 4.2. Я потратил около получаса пытаясь найти ошибку в моем коде, но проблема ушла после закрытия Xcode и удаления данных папок. Вот это сочетание:

РМ -РФ ~/библиотеки/разработчик/в Xcode/DerivedData

Комментарии (0)

В моем случае ошибка была брошена в Xcode при запуске приложения в симуляторе iOS. Пока я не могу ответить на конкретный вопрос "Что значит ошибке", Я могу сказать, что помогло мне, может это также поможет другим.

Решение для меня было, чтобы Стереть контент и настройки в симуляторе и в папку чистую сборку...` в Xcode.

Комментарии (0)

Это случилось со мной, потому что в Xcode не'т, кажется, нравится мне, используя то же имя переменной в двух разных классах (что соответствует один и тот же протокол, если это имеет значение, хотя имя переменной имеет никакого отношения, связанные в любой протокол). Я просто переименовал свою новую переменную.

Мне пришлось выйти на сеттеров, где это было сбоев, чтобы увидеть его, во время отладки. Этот ответ относится к iOS

Комментарии (0)

Если ошибка внутри закрытия, что определяет " я " как "бесхозный", вы можете быть ограничены в том, что вы можете открыть и получить этот код ошибки в определенных ситуациях. Особенно во время отладки. Если это дело для вас, попробуйте изменить [бесхозный "я"] " на " [слабые личности]

Комментарии (0)

Я получил эту ошибку, при этом:

 NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] initWithObjectsAndKeys:, nil]; //with 17 objects and keys

Он ушел, когда я вернулась с:

NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] init];
[aDictionary setObject:object1 forKey:@"Key1"]; //17 times
Комментарии (0)