2012-05-24 10 views
20

Realmente no puedo entender por qué tengo este error.EXC_BAD_INSTRUCTION (código = EXC_I386_INVOP, subcódigo = 0x0)

En primer lugar la parada del depurador al código de máquina

enter image description here

El hilo también muestra nada. El programa se pare en ningún código realidad

enter image description here

lo tanto, tiene algo que ver con _dispatch_worker_thread

¿Qué es eso?

¿De qué forma puedo solucionar esto? ¿Debería retroceder?

+2

Esto suele ocurrir cuando un objeto que ya ha sido puesto en libertad antes de que desea utilizar it. [Este blog] (http://www.andrashatvani.com/2011/05/understanding-excbadaccess.html) podría ayudar pero por favor también muestre código. – Tikkes

+2

¿Tiene un punto de interrupción establecido en excepciones?Haga clic en la pestaña de puntos de interrupción -> Presione el botón más en la parte inferior izquierda -> Haga clic en 'Agregar punto de interrupción de excepción' -> Hacer clic en la configuración predeterminada normalmente es correcto. A continuación, vuelva a ejecutar –

+0

Lo intentaré. Por alguna razón, no vuelve a suceder. Además, debido a que estoy usando ARC, creo que debería olvidarse de la liberación y otras cosas. –

Respuesta

5

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP) es el subproducto de un __builtin_trap() - que es una función intrínseca de GCC y clang. En ella obtenemos x 86

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 el culpable aquí, y no se maneja especialmente por Xcode.

En ARM compilamos en trap y da como resultado un punto de interrupción trace en XCode. ¿Es esto un error en clang que tenemos aquí?

En última instancia, en el contexto de la pregunta original, sospecho que la función de la biblioteca que está fallando ha alcanzado una aserción.

+0

Estoy teniendo el mismo problema, ¿alguna idea de cómo resolver esto? – 8vius

+0

Como esta excepción fue el resultado de una macro de aserción, solucioné el problema que la generaba en primer lugar. Afortunadamente, tenía el código fuente para el componente en cuestión. Su primer puerto de escala debe ser obtener una traza inversa completa y trabajar en la pila de llamadas. Si, como en el caso de otro póster de un problema similar que vi, está en una biblioteca suministrada por Apple, supongo que debe verificar a fondo el uso de las API. – marko

8

Este tipo de bloqueo ocurrirá cuando se ejecuta una extensión (vector) que no es compatible con su CPU.

Por ejemplo, en Xcode 5 en el epígrafe" Ajustes del proyecto/construcción-settings/Generación de código, establece la "Habilitar extensiones de vector adicional" a "AVX2". Construir su ejecutable.

Ahora ejecutarlo en una :

  • Intel Core i5: que va a chocar (siempre que el compilador decidió utilizar AVX2) con 'exc_i386_invop subcódigo = 0x0'
  • Intel Core i7:.. que funcionará
+0

No tenga este bloqueo en el procesador Intel G620 Y se bloquee cada vez con la clase AVPlayer en Intel Core i5. – rozochkin

0

En mi caso, estaba agregando un observador para contentSize a UITextView en viewDidLoad y nunca lo quité. Se corrigió agregándolo en viewDidAppear y luego eliminándolo en viewWillDisappear. era tan molesto para averiguar :(

Añadir observador en viewDidAppear

[self.textViewMessage addObserver:self 
          forKeyPath:NSStringFromSelector(@selector(contentSize)) 
           options:NSKeyValueObservingOptionNew 
           context:nil]; 

Quitar observador en viewWillDisappear

[self.textViewMessage removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))]; 
Cuestiones relacionadas