2012-05-24 10 views
20

Non riesco davvero a capire perché ho questo bug.EXC_BAD_INSTRUCTION (codice = EXC_I386_INVOP, sottocodice = 0x0)

Innanzitutto fermata debugger in codice macchina

enter image description here

Il filo mostra anche nulla. La fermata del programma a nessun codice in realtà

enter image description here

Così ha qualcosa a che fare con _dispatch_worker_thread

Che cosa è questo?

In qualsiasi modo come posso eseguire il debug di questo? Devo solo eseguire il rollback?

+2

Ciò si verifica in genere quando un oggetto è già stato divulgato prima che si desidera utilizzare it. [Questo blog] (http://www.andrashatvani.com/2011/05/understanding-excbadaccess.html) potrebbe essere d'aiuto, ma si prega di mostrare anche qualche codice. – Tikkes

+2

Hai un punto di interruzione impostato sulle eccezioni?Fare clic sulla scheda punti di interruzione -> Hit il pulsante più in basso a sinistra -> Fare clic su 'Aggiungi punto di interruzione eccezione' -> Hit fatto con le impostazioni predefinite è normalmente bene. Quindi corri di nuovo –

+0

proverò. Per qualche ragione, non succede più. Anche perché sto usando ARC, penso che il rilascio e le cose dovrebbero essere risolti. –

risposta

5

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP) è il sottoprodotto di un __builtin_trap() - che è una funzione intrinseca GCC e clang. Su di esso x86 otteniamo

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 

L'istruzione ud2 è il colpevole qui, e non è gestita appositamente da Xcode.

Su ARM questo viene compilato in trap e risulta in un punto di interruzione trace in XCode. È un bug in clang che abbiamo qui?

In definitiva, nel contesto della domanda originale, ho il sospetto che la funzione di libreria che ha esito negativo abbia rilevato un'asserzione.

+0

Sto avendo lo stesso problema, qualche idea su come risolvere questo? – 8vius

+0

Poiché questa eccezione era il risultato di una macro di asserzione, ho risolto il problema che stava generando in primo luogo. Fortunatamente, ho avuto il codice sorgente per il componente in questione. La prima porta di chiamata dovrebbe essere quella di ottenere un backtrace completo e ridurre il numero di chiamate. Se - come nel caso di un altro poster di un problema simile che ho visto - è contenuto in una libreria fornita da Apple, credo che sia necessario controllare molto accuratamente l'utilizzo delle API. – marko

8

Questo tipo di arresto anomalo si verificherà quando si esegue un'estensione (vettoriale) non supportata dalla CPU.

Per esempio, in Xcode 5 in "project-settings/build-settings/Generazione di codice, impostare il "Abilita estensioni vettore supplementari" a "AVX2". Costruisci la tua eseguibile.

Ora eseguirlo su un :

  • Intel core i5: sta andando in crash (laddove il compilatore ha deciso di utilizzare AVX2) con 'exc_i386_invop sottocodice = 0x0'
  • Intel core i7:.. funzionerà
+0

Non si è verificato un arresto anomalo del processore Intel G620 E si blocca ogni volta con la classe AVPlayer su Intel Core i5. – rozochkin

0

Nel mio caso stavo aggiungendo un osservatore per contentSize a UITextView in viewDidLoad e non lo stavo mai rimuovendo. Risolto il problema aggiungendolo in viewDidAppear e quindi rimuovendolo in viewWillDisappear. E 'stato così fastidioso per scoprire :(

Aggiungere osservatore viewDidAppear

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

Rimuovi osservatore viewWillDisappear

[self.textViewMessage removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))]; 
Problemi correlati