EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, подкод = 0x0)
Я действительно не могу понять, почему у меня эта ошибка.
Прежде всего остановка отладчика в машинный код
![enter image description here]()
В потоке также ничего не отображается. Программа останавливается без кода вообще
![enter image description here]()
Итак, это имеет какое-то отношение к _dispatch_worker_thread
Что это?
Как я могу отладить это? Должен ли я просто откатиться?
Ответы
Ответ 1
Этот вид сбоя произойдет, когда вы используете расширение (вектор), которое не поддерживается на вашем процессоре.
Например, в xcode 5 в разделе "project-settings/build-settings/Code Generation" установите
"Включить дополнительные векторные расширения" в "AVX2". Создайте свой исполняемый файл.
Теперь запустите его на:
- Intel Core i5: он будет разбиваться (везде, где компилятор решил использовать avx2) с "exc_i386_invop subcode = 0x0".
- Intel Core i7: он будет работать.
Ответ 2
EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP)
является побочным продуктом a __builtin_trap()
- который является GCC и внутренней функцией clang. На x86 мы получаем
0x4dfa2: movl %esi, (%esp)
0x4dfa5: movl %edx, 4(%esp)
0x4dfa9: movl %eax, 8(%esp)
0x4dfad: calll 0x110ffa ; symbol stub for: objc_msgSend
0x4dfb2: cmpb $0, %al
0x4dfb4: je 38
-> 0x4dfba: ud2
0x4dfbc: movl -32(%ebp), %eax
Инструкция ud2
является виновником здесь и не обрабатывается специально Xcode.
В ARM мы скомпилируем его в trap
и получим точку прерывания trace
в XCode. Является ли это ошибкой в clang
здесь?
В конечном счете, в контексте исходного вопроса, я подозреваю, что функция библиотеки, которая терпит неудачу, попала в утверждение.
Ответ 3
В моем случае я добавлял наблюдателя для contentSize
к UITextView
в viewDidLoad и никогда не удалял его. Исправил его, добавив его в viewDidAppear
, а затем удалив его в viewWillDisappear
.
Это было так раздражать, чтобы узнать: (
Добавить наблюдателя в viewDidAppear
[self.textViewMessage addObserver:self
forKeyPath:NSStringFromSelector(@selector(contentSize))
options:NSKeyValueObservingOptionNew
context:nil];
Удалить наблюдателя в viewWillDisappear
[self.textViewMessage removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))];