Подтвердить что ты не робот

EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, подкод = 0x0)

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

Прежде всего остановка отладчика в машинный код

enter image description here

В потоке также ничего не отображается. Программа останавливается без кода вообще

enter image description here

Итак, это имеет какое-то отношение к _dispatch_worker_thread

Что это?

Как я могу отладить это? Должен ли я просто откатиться?

4b9b3361

Ответ 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))];