objective c - EXC_BAD_INSTRUCTION(código=EXC_I386_INVOP, subcódigo=0x0)
objective-c xcode4.3 (3)
En mi caso, estaba agregando un observador para contentSize
a un UITextView
en viewDidLoad y nunca lo estaba eliminando. Se viewDidAppear
agregándolo en viewDidAppear
y luego eliminándolo en viewWillDisappear
. Fue tan molesto descubrirlo :(
Añadir observador en viewDidAppear
[self.textViewMessage addObserver:self
forKeyPath:NSStringFromSelector(@selector(contentSize))
options:NSKeyValueObservingOptionNew
context:nil];
Eliminar el observador en la viewWillDisappear
[self.textViewMessage removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))];
Realmente no puedo entender por qué tengo este error.
En primer lugar, el depurador se detiene en el código de máquina
El hilo tampoco muestra nada. El programa se detiene en ningún código en realidad
Así que tiene algo que ver con _dispatch_worker_thread
¿Que es eso?
¿De alguna manera cómo puedo depurar esto? ¿Debo simplemente retroceder?
Este tipo de bloqueo ocurrirá cuando esté ejecutando una extensión (vector) que no es compatible con su CPU.
Por ejemplo, en xcode 5 bajo "Configuración de proyecto / configuración de compilación / Generación de código, configure" Activar extensiones de vectores adicionales "a" AVX2 ". Genere su ejecutable
Ahora ejecútalo en un:
- Intel Core i5: se bloqueará (siempre que el compilador haya decidido usar avx2) con ''exc_i386_invop subcode = 0x0''.
- Intel Core i7: funcionará.
EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP)
es el subproducto de __builtin_trap()
, que es una función intrínseca GCC y clang. En x86 lo conseguimos
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
La instrucción ud2
es la culpable aquí, y no es manejada especialmente por Xcode.
En ARM, esto se compila en trap
y da como resultado un punto de interrupción de trace
en XCode. ¿Es esto un error en el clang
que tenemos aquí?
En última instancia, en el contexto de la pregunta original, sospecho que la función de biblioteca que está fallando ha llegado a una afirmación.