2012-05-24 8 views
20

Ich kann wirklich nicht herausfinden, warum ich diesen Fehler habe.EXC_BAD_INSTRUCTION (Code = EXC_I386_INVOP, Subcode = 0x0)

Zunächst wird der Debugger Stopp am Maschinencode

enter image description here

Der Faden zeigt auch nichts. Der Programmstopp ohne Code tatsächlich

enter image description here

Also es hat etwas mit _dispatch_worker_thread

zu tun Was ist das?

Wie kann ich dies debuggen? Sollte ich nur zurückrollen?

+2

Dies tritt in der Regel, wenn ein Objekt bereits freigegeben wurde, bevor Sie verwenden möchten es. [Dieser Blog] (http://www.andraschatvani.com/2011/05/understanding-excbadaccess.html) könnte helfen, aber bitte zeigen Sie auch einige Code. – Tikkes

+2

Haben Sie einen Breakpoint auf Ausnahmen gesetzt?Klicken Sie auf die Registerkarte "Haltepunkte" -> Klicken Sie auf die Plus-Schaltfläche unten links -> Klicken Sie auf "Ausnahme-Haltepunkt hinzufügen" -> "Fertig" mit den Standardeinstellungen ist normalerweise in Ordnung. Dann renne wieder –

+0

Ich werde es versuchen. Aus irgendeinem Grund passiert es nicht wieder. Auch weil ich ARC benutze, denke ich, dass die Veröffentlichung und andere Dinge vorsichtig sein sollten. –

Antwort

5

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP) ist das Nebenprodukt eines __builtin_trap() - das ist ein GCC und Clang intrinsische Funktion. Auf x86 es bekommen wir

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 

Die Anweisung ud2 ist der Täter hier, und nicht speziell von Xcode behandelt.

Auf ARM wir kompiliert dies in trap und führt zu einem trace Break-Point in XCode. Ist das ein Fehler in clang haben wir hier?

Letztlich im Kontext der ursprünglichen Frage vermute ich, dass die Bibliotheksfunktion, die fehlschlägt, eine Assertion getroffen hat.

+0

Ich habe das gleiche Problem, irgendeine Idee, wie man das löst? – 8vius

+0

Da diese Ausnahme das Ergebnis eines Assertion-Makros war, habe ich das Problem behoben, das es an erster Stelle erzeugt hat. Zum Glück hatte ich den Quellcode für die betreffende Komponente. Ihre erste Anlaufstelle sollte es sein, einen vollständigen Backtrace zu erhalten und den Call-Stack zu reduzieren. Wenn - wie bei einem anderen Poster eines ähnlichen Problems, das ich gesehen habe - es sich um eine von Apple gelieferte Bibliothek handelt, müssen Sie Ihre Verwendung von APIs sehr gründlich überprüfen. – marko

8

Diese Art von Absturz wird auftreten, wenn Sie eine (Vektor-) Erweiterung ausführen, die von Ihrer CPU nicht unterstützt wird.

Zum Beispiel in Xcode 5 unter „Projekt-Einstellungen/Build-Einstellungen/Code-Generierung, stellt die "Enable Zusätzlichen Vector Extensions" auf "AVX2". Ausführbare Datei erstellen.

Jetzt ist es auf einem laufen :

  • Intel Core i5: es zum Absturz geht (wo auch immer der Compiler zu verwenden AVX2 entschieden) mit 'exc_i386_invop Subcode = 0x0'
  • Intel Core i7:.. es funktioniert
+0

Haben Sie nicht diesen Absturz auf Intel G620-Prozessor Und es stürzt jedes Mal mit AVPlayer-Klasse auf Intel Core i5. – rozochkin

0

In meinem Fall habe ich einen Beobachter für contentSize zu einem UITextView in ViewDidLoad hinzugefügt und es nie entfernt. Es wurde behoben, indem es in viewDidAppear hinzugefügt und dann in viewWillDisappear entfernt wurde. Es war so ärgerlich, um herauszufinden :(

Beobachter hinzufügen in viewDidAppear

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

entfernen Beobachter in viewWillDisappear

[self.textViewMessage removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))]; 
Verwandte Themen