web-dev-qa-db-fra.com

EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, sous-code = 0x0)

Je ne peux vraiment pas comprendre pourquoi j'ai ce bug.

Tout d’abord, le débogueur s’arrête au code machine

enter image description here

Le fil ne montre rien non plus. Le programme s’arrête sans code en fait

enter image description here

Donc, cela a quelque chose à voir avec _dispatch_worker_thread

Qu'est-ce que c'est?

De toute façon comment je peux déboguer cela? Devrais-je simplement revenir en arrière?

20
user4951

Ce type de crash se produit lorsque vous exécutez une extension (vectorielle) non prise en charge par votre CPU.

Par exemple, dans xcode 5, sous "Paramètres du projet/Paramètres de construction/Génération de code, définissez l'option" Activer les extensions de vecteur supplémentaires "sur" AVX2 ". Générez votre exécutable.

Maintenant, lancez-le sur:

  • Intel Core i5: il va planter (où le compilateur a décidé d'utiliser avx2) avec 'exc_i386_invop subcode = 0x0'.
  • Intel Core i7: ça va marcher.
8
kalmiya

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP) est le sous-produit d'une __builtin_trap() - qui est une fonction intrinsèque de GCC et de clang. Sur x86 nous obtenons

    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'instruction ud2 est la cause ici et n'est pas gérée spécialement par Xcode.

Sur ARM, ceci est compilé en trap et donne un point d'arrêt trace dans XCode. Est-ce un bug dans clang que nous avons ici?

En fin de compte, dans le contexte de la question initiale, je soupçonne que la fonction de bibliothèque défaillante a atteint une assertion.

5
marko

Dans mon cas, j’ajoutais un observateur pour contentSize à une UITextView dans viewDidLoad et je ne l’enlevais jamais. Corrigé en l'ajoutant dans viewDidAppear puis en le supprimant dans viewWillDisappear. C'était tellement énervant de découvrir :(

Ajouter un observateur dans viewDidAppear

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

Supprimer l'observateur dans viewWillDisappear

[self.textViewMessage removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))];
0
Zeeshan Tufail