Xcode n'affiche pas la ligne qui provoque un crash

Chaque fois que mon application tombe en panne, Xcode met en surbrillance l'appel UIApicationMain () dans la fonction main () comme la ligne qui a causé le plantage. Dans certains cas, cela était normal (erreur de segmentation par exemple) mais le crash auquel j'essaie de faire face est un simple SIGABRT avec des informations détaillées enregistrées dans la console:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)' 

Xcode utilisé pour afficher la ligne juste avec les anciens SDK, mais depuis que j'ai mis à niveau vers Xocde 4.2 qui a changé. Il est assez évident que Xcode sait exactement ce qui a causé le crash (ou pourrait le savoir), mais il ne montre toujours pas la ligne réelle. Y a-t-il un correctif ou une solution de contournement pour cela?

    Vous devez également vous assurer que vous avez défini des points d'arrêt pour toutes les exceptions. Cela provoquera l'arrêt de Xcode sur la ligne où l'exception se produit. Procédez comme suit [dans Xcode 4]:

    1. Dans le browser de projet sur le côté gauche de Xcode, click le browser de point d'arrêt (presque tout le path à droite de la barre de buttons supérieure L'icône ressemble à une grosse flèche droite).

    2. En bas du browser, click le button "+".

    3. Cliquez sur "Ajouter un point d'arrêt d'exception".

    4. Un nouveau point d'arrêt sera créé. Il devrait être configuré au besoin mais vous pouvez modifier son comportement.

    5. Exécutez votre projet et reproduisez l'exception.

    Vous avez également mentionné que vous étiez lié à des bibliothèques / frameworks tiers. Si l'exception se produit dans ces frameworks, alors vous allez avoir du mal puisque le code est compilé et Xcode ne peut pas réellement vous montrer la ligne qui a provoqué l'exception. Si tel est le cas et que vous êtes certain que vous utilisez correctement les bibliothèques, vous devez alors envoyer un rapport de bogue aux responsables de ces bibliothèques.

    Suivez simplement les instructions de cette réponse StackOverflow:

    Activer les zombies

    Fondamentalement, vous avez juste besoin de "Activer Zombies". Alors Xcode devrait casser à n'importe quelle ligne causant le problème.

    entrez la description de l'image ici

    (Il est absolument choquant que, même en 2017, Xcode a toujours cette option désactivée par défaut Pourquoi ne voudriez-vous pas voir la ligne qui a causé le problème? Et " Activer les objects Zombie "? Vraiment?! Est-ce que les auteurs Xcode vraiment Je crois que c'est un nom utile, qui aurait du sens pour les nouveaux développeurs, c'est déprimant de voir comment la cote de Xcode est mauvaise, année après année, dans l'App Store.

    Editez le schéma actuel et activez NSZombieEnabled , MallocStackLogging et guard malloc . Ensuite, lorsque votre application se bloque, tapez ceci dans la console gdb:

     (gdb) info malloc-history 0x543216 

    Remplacez 0x543216 par l'adresse de l'object qui a provoqué l' NSInvalidArgumentException et cela devrait vous donner une trace de stack beaucoup plus utile, montrant les lignes de votre code qui causent le crash.

    J'ai vu ce comportement dans le code fortement optimisé; vérifier, ajuster le niveau d'optimization de votre cible et ceux des bibliothèques tierces peut aider. (Paramètre de niveau d'optimization LLVM 3.0)

    Générez-vous des symboles de debugging?

    J'ai écrit du code pour générer un crash d'index hors limite. Voici l'exception lancée.

     2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]' *** First throw call stack: ( 0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48 2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111 3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61 4 testABC 0x000000010dce95db -[ViewController thirdFunction] + 43 5 testABC 0x000000010dce959b -[ViewController secondFunction] + 43 6 testABC 0x000000010dce955b -[ViewController firstFinction] + 43 7 testABC 0x000000010dce96c2 -[ViewController viewDidAppear:] + 50 8 UIKit 0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945 9 UIKit 0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42 10 UIKit 0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86 11 UIKit 0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653 12 UIKit 0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566 13 UIKit 0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194 14 CoreFoundation 0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 15 CoreFoundation 0x000000010e7e66f4 __CFRunLoopDoBlocks + 356 16 CoreFoundation 0x000000010e7e5e65 __CFRunLoopRun + 901 17 CoreFoundation 0x000000010e7e5884 CFRunLoopRunSpecific + 420 18 GraphicsServices 0x00000001126d9a6f GSEventRunModal + 161 19 UIKit 0x000000010ec80c68 UIApplicationMain + 159 20 testABC 0x000000010dce99df main + 111 21 libdyld.dylib 0x000000011174968d start + 1 22 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException 

    Si vous lisez attentivement la First Throw call stack

     0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48 

    0 and 1 sont les process du système après un crash.

      2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111 

    2 est la ligne qui a provoqué l'exception.

     3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61 

    3 vous indique le nom de la class ( ViewController ) et la fonction naem ( ComplexFunction ) dans laquelle l'exception a été levée.