Je ne peux vraiment pas comprendre pourquoi j'ai ce bug.
Tout d’abord, le débogueur s’arrête au code machine
Le fil ne montre rien non plus. Le programme s’arrête sans code en fait
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?
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:
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.
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))];